我有下面这样的代码这是否会创建NullPointerException,如果不是,为什么不呢?
String name = null;
if (something)
name = someString;
if (name != null && name.equals("XYZ"))
doSomethingWith ("hello");
请问上述情况是否导致空指针异常,如果“东西”是假的线路? 如果不是为什么不呢?
我有下面这样的代码这是否会创建NullPointerException,如果不是,为什么不呢?
String name = null;
if (something)
name = someString;
if (name != null && name.equals("XYZ"))
doSomethingWith ("hello");
请问上述情况是否导致空指针异常,如果“东西”是假的线路? 如果不是为什么不呢?
不,它不会。如果name
是null
,那么name.equals()
将不会被执行(因为false && anything
仍然是false
)。顺便说一句:如果左手边的计算结果为true
,则不检查右手边。
不,它不会。 & &操作的右侧被执行只有& &运营商的左侧是真实的。
同样在的情况下。运营商,如果左手边是真的,右手边将不会被执行。
RHS =右手侧,LHS =左手侧。 – 2011-06-14 07:33:24
谢谢@Adriaan – 2011-06-14 08:15:53
不,它不会导致NullPointerException,因为如何编写if
语句。您有:从左至右
if (name != null && name.equals("XYZ")) {
//do stuff...
}
在if
语句中的条件进行评估。因此,如果name
为空,则name != null
条件评估为false
,并且由于false && <anything>
评估为false
,所以name.equals("XYZ")
条件甚至不会被评估。
此行为是一个runtime optimization,它避免执行不会影响if
语句结果的代码,并且它恰好也会阻止您的示例代码生成NullPointerException。
只是好奇,短路评估叫什么?有没有其他语言可以实现这种行为,上述问题可能会导致NPE? – zengr 2011-06-14 05:01:37
维基百科说,“热切的评价”(按照我给出的链接),但我从来没有听说过这个术语。我会说“贪婪”,因为这是正则表达式中用来取最大匹配而不是最短匹配的术语。看起来像Fortran做到了,Pascal可以做到这一点。尽管Visual Basic变体似乎提供了_means_,但它们也不会短路。 – paxdiablo 2011-06-14 05:02:36
我曾见过他们称之为非短路操作员的情况:) – Vern 2011-06-14 05:12:06