Java 为什么逻辑运算符会更改对象
为什么当我使用下面的代码时,eclipse用红色突出显示Java 为什么逻辑运算符会更改对象,java,logical-operators,Java,Logical Operators,为什么当我使用下面的代码时,eclipse用红色突出显示(!line.equals(“”),并说:null指针访问:变量行只能在这个位置为null 但如果我使用&而不是| |,我不会收到警告消息 代码: String line = br.readLine(); if ( (line != null) || (!line.equals("")) ) { } else { Log.d(TAG, "main", "file is empty");
(!line.equals(“”)
,并说:null指针访问:变量行只能在这个位置为null
但如果我使用&而不是| |,我不会收到警告消息
代码:
String line = br.readLine();
if ( (line != null) || (!line.equals("")) ) {
} else {
Log.d(TAG, "main", "file is empty");
}
因为&&&
(逻辑And)将按顺序检查条件,如果任何条件为false,则不会检查下一个条件。其中as|
(逻辑或)将进行检查,直到其中一个条件为真
因此,如果使用| |
,第一个条件(即行!=null
)可能为false,它将转到下一个条件(即!line.equals(“”
)并抛出NullPointerException
)
并且@piet.t正确地指出,如果第一个条件为真,那么如果您使用|
,它也不会进行空白检查
您可能还对感兴趣,因为
&&
(逻辑And)将按顺序检查条件,如果任何条件为false,则不会检查下一个条件。其中as|
(逻辑或)将进行检查,直到其中一个条件为真
因此,如果使用| |
,第一个条件(即行!=null
)可能为false,它将转到下一个条件(即!line.equals(“”
)并抛出NullPointerException
)
并且@piet.t正确地指出,如果第一个条件为真,那么如果您使用|
,它也不会进行空白检查
您可能还对感兴趣,因为您有一个OR(
|
)操作符,Java将确定
line != null
如果为false(如果行为null)
因此,当行
为空时,将执行第二个命令,并取消对空指针的引用。您的IDE正确地突出显示了这个问题。因为您有一个OR(|
)操作符,Java将确定
line != null
如果为false(如果行为null)
因此,当
行
为空时,将执行第二个命令,并取消对空指针的引用。您的IDE正确地突出显示了这个问题。这是因为操作员| | Java必须评估这两个条件才能给出结果。当Java尝试第二个条件时,npe将失败。这是因为运算符| | Java必须评估这两个条件并给出结果。当Java尝试第二个条件时,npe将失败。因为在&&
的情况下!只有在line!=null
为true,与行时的|
不同null
为真编译器力检查!line.equals(“”)语句并退出if()
,因为在&&
的情况下!只有在line!=null
为true,与行时的|
不同null
为真编译器力检查!line.equals(“”)语句并退出if()
&&是一个“短路”运算符。这意味着,如果left条件(line!=null)失败,将不会计算right条件,因此不存在NullPointerException的风险。为了确定OR的结果,必须对这两种情况进行评估(无论短路操作员如何)。因此发出警告。&p>是一个“短路”操作员。这意味着,如果left条件(line!=null)失败,将不会计算right条件,因此不存在NullPointerException的风险。为了确定OR的结果,必须对这两种情况进行评估(无论短路操作员如何)。因此发出警告。这是典型的“短路”
对于&&案例:
if ((line != null) && (!line.equals("")) {
如果line不等于null,则编译器没有理由处理If语句的第二部分。整个if语句必须是假的。因此它会使if语句的第二部分短路,并且不会得到null引用异常
当您将&&切换到| |时,编译器必须处理if语句的第二部分,因为如果其中一部分为真,则整个事情都是真的。因此,您可以获得null引用异常
注意:如果您还可以使用Apache commons lang的StringUtils在一个中同时执行两个检查:
if (StringUtils.isNotBlank(str))
更新:对于| |情况,如果第一部分为true,那么整个if语句必须为true,因此同样没有理由处理if语句的第二部分。这是一个经典的“短路”
对于&&案例:
if ((line != null) && (!line.equals("")) {
如果line不等于null,则编译器没有理由处理If语句的第二部分。整个if语句必须是假的。因此它会使if语句的第二部分短路,并且不会得到null引用异常
当您将&&切换到| |时,编译器必须处理if语句的第二部分,因为如果其中一部分为真,则整个事情都是真的。因此,您可以获得null引用异常
注意:如果您还可以使用Apache commons lang的StringUtils在一个中同时执行两个检查:
if (StringUtils.isNotBlank(str))
更新:对于| |情况,如果第一部分为true,则整个if语句必须为true,因此同样没有理由处理if语句的第二部分。因为您仍然可以输入后面的条件,该条件可能引发nullpointerexception。。换句话说,当第一个条件失败时,第二个条件将向您抛出一个异常,它是指(line==null)
,而不是(line!=null)
?否则,该条件看起来很奇怪(是的,当line
为null
时,它将导致空指针异常)。因为您仍然可以输入稍后的条件,该条件可能引发空指针异常。。换句话说,当第一个条件失败时,第二个条件会偶然向你抛出一个例外