Java中避免NullPointerException的方法总结

Java中避免NullPointerException的方法总结

在字符串常量上调用equals

// good
"string literal".equals(strObject)
// not good
strObject.equals("string literal")

如果strOject == null,那下面一种方法就会抛出NullPointerException

用valueOf代替toString

javaBigDecimal bd = getPrice();
// good
String.valueOf(bd);
// not good
bd.toString();

原因类似

使用null-safe的库

如Apache commons中的StringUtils,下面这些方法都不会抛出NullPointerException

StringUtils.isEmpty(null); // returns true
StringUtils.isBlank(null); // returns true
StringUtils.isNumeric(null); // returns false
StringUtils.isAllUpperCase(null); // returns false

函数尽量不要返回null,而是返回一个空的对象

Collections辅助类中有静态的EMPTY_LIST EMPTY_SET EMPTY_MAP,可以方便的使用它们

public List<Integer> f() {
  try {
    // ...
    return result;
  } catch (SomeException e) {
    e.printStackTrace();
    return Collections.EMPTY_LIST;
  }
}

使用@NotNull @Nullable的注解

加上了注解,部分IDE会帮你检查你是否没有检查可能为null的对象,或者你是否做了多余的检查。这个注解是JSR 305的一部分。但即使IDE不支持,这也会使代码的可读性变好。

注意加上的注解最好不要产生额外的依赖。java6中有@NotNull但它所在的包似乎并不默认就在JRE中,java8中有@NonNull,如果确定代码不用向下兼容,可以使用java8的@NonNull。

java@NonNull List<String> strList; // A non-null list of Strings.
List<@NonNull String> strList; // A list of non-null Strings.

避免不必要的自动装箱

java// Integer getPrice();
int price = obj.getPrice();

注意getPrice返回的是Integer而不是int,因此有可能是null。当它是null的时候,赋值给int类型的变量就会抛出NullPointerException。

定义合理的缺省值,以及利用数据库中的not null限制

javapublic class A {
  private List<Integer> intList = new ArrayList<Integer>();
  private String str = "";
}

比如类中的成员都给初始化一个空的对象。以及数据库中not null的字段在Java里我们就可以放心大胆的使用基本类型如int而不是Integer了。

实现一个表示null的类

这并不是通用的做法,对特定的业务逻辑比较有用。

有一个很好的例子就是著名JSON解析框架Jackson。以下代码是Jackson从一段JSON中获取其一级子节点lv1下的二级子节点lv2的内容:

JsonNode root = ...;
JsonNode child = root.get("lv1").get("lv2");

以上代码很可能遇到lv1不存在的情况,因此第一个get()就会返回null,那么第二个get()执行时自然就抛出NullPointerException了。为了解决这个问题,作者提供了path方法来替代get方法:

JsonNode root = ...;
JsonNode child = root.path("lv1").path("lv2");

当lv1不存在时,path()返回一个JsonNode的子类叫做MissingNode(但客户端暂时无需知道),MissingNode的path方法则继续返回MissingNode,这样无论这个链式调用写多长都不会抛出任何异常。

直到最后客户端调用完成后检查返回结果是否为MissingNode:

if (child.isMissingNode()) { ... }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • java 避免出现NullPointerException(空指针)的方法总结

    java 避免出现NullPointerException(空指针)的方法总结 Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键.俗话说"预防胜于治疗",对于这么令人讨厌的空指针异常,这句话也是成立的.值得庆幸的是运用一些防御性的编码技巧,跟踪应用中多个部分之间的联系,你可以将Java中的空指针异常控制在一个很好的水平上.顺便说一句,这是Javarevisited上的第二个空指针异常的帖子.在上个帖子中我们讨论了Java中导致空指针异常的常见原因

  • Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException解决办法: 利用Java操作XML,在操作XML过程中,执行到最后一步,在利用Transformer进行XML转换时出现NullPointerException错误,出问题的部分代码如下: //转换 TransformerFactory tFactory =TransformerFactory.newInstance(); Tr

  • Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法

    当然这个东西很吃内存,配置差点的就不推荐使用了. 最近用的时候, 发现, 建立PHP工程后,再打开 Zend Studio for Eclipse就出现这个错误 An internal error occurred during: "Building PHP projects ..."java.lang.NullPointerException 很烦人的. 出错后PHP projects 会停止build,代码提示就全部没有了.需要手动rebuild. 今天在zend论坛找到一个解决办

  • java 出现NullPointerException的原因及解决办法

    java 出现NullPointerException的原因及解决办法 日常开发过程中,最常见的异常莫过于NullPointerException,之前的时候,只是知道去找到报错的位置,然后去解决它,最近有空学习C语言,就去深究了下NullPointerException异常的本质. 发生NullPointerException的情况: 调用 null 对象的实例方法. 访问或修改 null 对象的字段. 如果一个数组为null,试图用属性length获得其长度时. 如果一个数组为null,试图

  • Java中避免NullPointerException的方法总结

    Java中避免NullPointerException的方法总结 在字符串常量上调用equals // good "string literal".equals(strObject) // not good strObject.equals("string literal") 如果strOject == null,那下面一种方法就会抛出NullPointerException 用valueOf代替toString javaBigDecimal bd = getPri

  • 详解Java中Method的Invoke方法

    在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错.虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码.  Method的invoke方法 1.先检查 AccessibleObject的override属性是否为true. Accessib

  • java中构造方法和普通方法的区别说明

    1.普通方法: 定义:简单的说方法就是完成特定功能的代码块. 普通方法定义格式: 修饰符 返回值类型 方法名 (参数类型 参数名1,参数类型 参数名2,.........) { 函数体: return 返回值: } 返回值类型用于限定返回值的数据类型. 普通方法分为:有明确返回值的方法和没有明确返回值的方法. A.有明确返回值的方法的调用 可以单独调用(无意义).输出调用.赋值调用(推荐). public static int sum (int a , int b) { int c =a+b;

  • 在Java中避免NullPointerException的解决方案

    我object != null要避免很多NullPointerException. 有什么替代方法: if (someobject != null) { someobject.doCalc(); } 解决方案: 在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null.另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值. 换句话说,在两种情况下会出现空检查: 如

  • 关于Java 中 Future 的 get 方法超时问题

    目录 一.背景 二.模拟 2.1 常见写法 2.2 尝试取消 2.2.1 cancel(false) 2.2.2 cancel(true) 三.回归源码 四.总结 一.背景 很多 Java 工程师在准备面试时,会刷很多八股文,线程和线程池这一块通常会准备线程的状态.线程的创建方式,Executors 里面的一些工厂方法和为什么不推荐使用这些工厂方法,ThreadPoolExecutor 构造方法的一些参数和执行过程等. 工作中,很多人会使用线程池的 submit 方法 获取 Future 类型的

  • Java中Spring获取bean方法小结

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制.BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供

  • Java中计算时间差的方法

    本文实例讲述了Java中计算时间差的方法.分享给大家供大家参考.具体如下: 假设现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方法一: DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date d1 = df.parse("2004-03-26 13:31:40"); Date

  • java 中enum的使用方法详解

    java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

  • Java中ArrayList的removeAll方法详解

    本文介绍的是关于Java中ArrayList的removeAll方法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 在开发过程中,遇到一个情况,就是从所有骑手Id中过滤没有标签的骑手Id(直接查询没有标签的骑手不容易实现), List<Integer> allRiderIdList = new ArrayList(); // 所有的骑手,大致有23W数据 List<Integer> hasAnyTagRiderId = new ArrayList(); // 有标签

  • Java中线程的基本方法使用技巧

    java中线程的基本方法的熟练使用是精通多线程编程的必经之路,线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等,本文浅要的介绍一下它们的使用方式. 线程的状态图 java将操作系统中的就绪和运行两种状态统称为可运行状态,java中线程的状态可以认为有以上六种. wait 调用该方法的线程进入WAITING状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用wait()方法后,会释放对象的锁. 因此,wait方法一般用在同步方法或同步代码

随机推荐