if(str.isEmpty()){str=DEFAULT_STRING;}上面的代码有时会给出一个NullPointerException。如何重写条件(从A-D中选择),使这个问题不会发生?A:str==null&&str.isEmpty()B:str==null||str.isEmpty()C:str.isEmpty()&&str==nullD:str.isEmpty()||str==null答案是B。我想知道B和D有什么区别?为什么D不对?
2 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
||或操作是只要其中一个值为真则整个表达式就为真,判定真与否的顺序是从左至右的,只要有一个判定是真的那么其后面的判定就不会执行了,比如你这里的str==null||str.isEmpty()首先判定str==null的真假,然后再判定str.isEmpty()的真假(从左至右判定)。当判断str==null为真时,str.isEmpty()就不会执行判定了(因为只要其中一个为真,则整个表达式就为真)。所以B选项和D选项执行的顺序(判断str==null和str.isEmpty()的顺序)是不一样的,B选项先判定str==null,D选项先判定str.isEmpty()。假如str就是null,B选项先判定str==null(为真),str.isEmpty()就不会执行了,也就不会报空指针异常了。而D选项先判定str.isEmpty(),str为null,就会抛空指针异常。总结:B选项执行str.isEmpty()的条件是,str!=null;而D选项无论str是否为null,都会执行str.isEmpty()。
BIG阳
TA贡献1859条经验 获得超6个赞
关键词:短路特性。表达式A||B,如果A已经判断为真,则这个表达式的值就确定了,不会再执行和判断B。同样的还有A&&B,B为假的时候。就这个题目来说,str==null||str.isEmpty()的意思就是,先判断str是不是null,如果是null,这句肯定就是真了,后面半句就不执行了,不执行,自然就不会报错啦。ps.话说我都给了关键词了,百度一下嘛同学。。。
添加回答
举报
0/150
提交
取消
