在 Java 开发中,NullPointerException 可以说是第一大异常了,不仅参数可能为空,网络请求,IO 加载,数据库查询的数据都可能为空,如果我们直接使用空的引用,就会有 NullPointerException 异常了。
但是,有些初学者可能很疑惑,我到底应该什么时候做判空操作,判空操作的一些准则是什么?其实我也是初学者,只是随着开发时间的增加,对判空的有了比初学时多的一点点的理解,在这里记录下来,希望可以帮到别人,同样让自己记忆更加深刻。
关于空指针异常
其实并不是每次使用一个空引用时都会发生异常,发生异常时都是我们真正去使用这个引用指向的对象时才会抛出空指针异常。看两个例子:
eg:
public String getString(){
return null;
}
public int getInt(String str){
return str.length();
}
String str = getString(); // 不会抛出异常
int index = getString(str); // 会抛出 NullPointerException 异常
上面这个例子中很直观的体现了空指针什么时候会发生,
getString(); 方法直接返回了 null,我们为 str 引用赋值为 null,是不会发生异常的,原因是我们直接使用了引用,并没有使用引用具体指向的对象,引用在栈内存中,是可以使用的。
getInt(String str); 方法中使用 str.length(); 时,发生了异常,原因为我们此时真正使用的是 str 引用指向的对象在堆中的地址或者常量池中的地址,因为该引用指向的是 null ,所以此时会抛出空指针异常。
判空操作
有关判空操作,并不是每次使用一个对象时都要去判空。如果我们确定一个对象不为空,这时候就不用判空,如果出现空指针说明使我们的代码设计问题,是需要修改编程策略去解决问题,不能直接加判空来实现。
还有一种情况是,我们的数据是别的地方传来的,这时候我们就需要做判断了,接下来就说这种情况下如何判空。
判空时机
第一种情况是我们在一个方法中通过传参数或者拿别的引用,赋值给另外一个引用,这时候是不需要进行判空操作的,除非我们确定如果这步为空时对接下来的逻辑是起决定性作用的,比如如果这个参数为空,接下来的操作都不需要做,直接返回,这时候需要判空
第二种情况是我们确实要使用这个参数或者别的地方得到的引用指向的内存地址中的对象,这时候,我们就必须要做判空操作了,因为这时候为空时不但会引起程序的 crash ,还会影响我们对空对象是的处理逻辑,这时候判空,根据是否为空来做具体操作。
网友评论