为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

犯罪嫌疑人X 2019-05-23 19:53:52
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()。
                            
查看完整回答
反对 回复 2019-05-23
?
BIG阳

TA贡献1859条经验 获得超6个赞

关键词:短路特性。表达式A||B,如果A已经判断为真,则这个表达式的值就确定了,不会再执行和判断B。同样的还有A&&B,B为假的时候。
就这个题目来说,str==null||str.isEmpty()的意思就是,先判断str是不是null,如果是null,这句肯定就是真了,后面半句就不执行了,不执行,自然就不会报错啦。
ps.话说我都给了关键词了,百度一下嘛同学。。。
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 542 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号