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不对?
推荐你去看看源码
str == null 是看这个对象是否分配内存空间, 如果没有分配自然就是null , 也就是这个引用是null
str.isEmpty() 是判断这个对象是否为空值, 但是需要这个对象引用不是null, 也就是说必须分配内存空间, 才可以
public boolean isEmpty() { return count == 0; }
可以看上面源码 这个方法是判断这个对象的count == 0
你问题B 和 D的区别 , 一个是先判断对象引用是否为null(也就是是否分配内存空间) , 然后再判断是否为空值; 这个是正确的;
另一个先判断是否为空值, 然后再判断对象引用是否为null, 但是 这个对象引用都是null, 这里在调用这个空引用的对象count属性自然会报空指针异常
你选D的话当str为null的时候同样也会抛空指针异常(左边第一个判断str为null,所以根本就没办法执行isEmpty),而B中左边判断==null,当str为null时就短接了,后面的str.isEmpty就不会再执行了
不好意思还是不明白,D中不是先判断isEmpty吗?搞不懂B和D的区别。
@jinleiDev: 楼上说的那个有误,并不是因为判断count报错,而是str本身为null了,那么根本就谈不上能够调用实例方法isEmpty了。
在逻辑或判断中 A||B
如果A成立那么B就不会继续执行而直接会跳到后续逻辑上,在你这题的B和D两个答案中,虽然看上去只是互换了A和B的位置,但由于D中先判断isEmpty,而由于str本身已经是null,根本不可能执行其实例方法所以报错,而B中由于是先判断的str==null,这个如果已经成立后面的isEmpty就不用判断,因此也不会报错