首页 新闻 会员 周边 捐助

一个问题?有关||的应用和空指针异常

0
悬赏园豆:5 [已解决问题] 解决于 2017-12-28 23:46

if(str.isEmpty()){
str = DEFAULT_STRING;
}

上面的代码有时会给出一个NullPointerException。 如何重写条件(从A-D中选择),使这个问题不会发生?

A:
str == null && str.isEmpty()


B:
str == null || str.isEmpty()


C:
str.isEmpty() && str == null


D:
str.isEmpty() || str == null

 

答案是B。我想知道B和D有什么区别?为什么D不对?

jinleiDev的主页 jinleiDev | 初学一级 | 园豆:142
提问于:2017-12-28 20:58
< >
分享
最佳答案
0

推荐你去看看源码

str == null  是看这个对象是否分配内存空间,  如果没有分配自然就是null ,  也就是这个引用是null  

str.isEmpty() 是判断这个对象是否为空值, 但是需要这个对象引用不是null, 也就是说必须分配内存空间, 才可以

public boolean isEmpty() {
    return count == 0;
}

可以看上面源码 这个方法是判断这个对象的count == 0 

 

 

你问题B 和 D的区别  , 一个是先判断对象引用是否为null(也就是是否分配内存空间) , 然后再判断是否为空值;  这个是正确的;

另一个先判断是否为空值, 然后再判断对象引用是否为null,  但是 这个对象引用都是null, 这里在调用这个空引用的对象count属性自然会报空指针异常

收获园豆:5
、熙和 | 小虾三级 |园豆:1508 | 2017-12-28 23:13
其他回答(1)
1

你选D的话当str为null的时候同样也会抛空指针异常(左边第一个判断str为null,所以根本就没办法执行isEmpty),而B中左边判断==null,当str为null时就短接了,后面的str.isEmpty就不会再执行了

Daniel Cai | 园豆:10424 (专家六级) | 2017-12-28 21:22

不好意思还是不明白,D中不是先判断isEmpty吗?搞不懂B和D的区别。

支持(0) 反对(0) jinleiDev | 园豆:142 (初学一级) | 2017-12-28 21:32

@jinleiDev: 楼上说的那个有误,并不是因为判断count报错,而是str本身为null了,那么根本就谈不上能够调用实例方法isEmpty了。

在逻辑或判断中 A||B

如果A成立那么B就不会继续执行而直接会跳到后续逻辑上,在你这题的B和D两个答案中,虽然看上去只是互换了A和B的位置,但由于D中先判断isEmpty,而由于str本身已经是null,根本不可能执行其实例方法所以报错,而B中由于是先判断的str==null,这个如果已经成立后面的isEmpty就不用判断,因此也不会报错

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2017-12-29 09:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册