Java 为什么逻辑运算符会更改对象

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");

为什么当我使用下面的代码时,eclipse用红色突出显示
(!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
时,它将导致空指针异常)。因为您仍然可以输入稍后的条件,该条件可能引发空指针异常。。换句话说,当第一个条件失败时,第二个条件会偶然向你抛出一个例外