NullPointerException在null检查java后发生

NullPointerException在null检查java后发生,java,null,nullpointerexception,Java,Null,Nullpointerexception,我有这个if语句 if((check1==null||!check1.isSolid())&&(check2==null)||!check2.isSolid()) 它抛出了一个空指针异常,因为check1或check2是空的,但我不明白它为什么要这样做,因为我在访问对象之前检查空条件,如果对象是空的,java为什么要费心检查isSolid,因为它已经是真的了。你的括号搞乱了。Java将您的语句按如下方式分组: ((check1 == null || !check1.isSoli

我有这个if语句

if((check1==null||!check1.isSolid())&&(check2==null)||!check2.isSolid())

它抛出了一个空指针异常,因为check1或check2是空的,但我不明白它为什么要这样做,因为我在访问对象之前检查空条件,如果对象是空的,java为什么要费心检查isSolid,因为它已经是真的了。

你的括号搞乱了。Java将您的语句按如下方式分组:

((check1 == null || !check1.isSolid()) && check2 == null) || !check2.isSolid()
如果
check1
null
check2
null
,则第一条语句的计算结果将为
true
。转到第二条语句时会出现问题,因为
check2
null
check2.isSolid()
将通过
NullPointerException
执行

将括号改为

(check1 == null || !check1.isSolid()) && (check2 == null || !check2.isSolid())

你把括号搞错了。尝试:

if((check1==null||!check1.isSolid())&&(check2==null||!check2.isSolid()))
试试这个:

boolean check1_result = (check1 == null) ? true : !check1.isSolid();
boolean check2_result = (check2 == null) ? true : !check2.isSolid();

if (check1_result && check2_result)
// do work...

试试这个:如果((check1==null | | | |!check1.isSolid())&((check2==null)| | |!check2.isSolid())@Satya-看起来你刚刚添加了一些空格。这不会有任何区别。Stephen我也更正了括号。为了将来,你可以帮自己一个忙,不要试图在没有换行符和空格的情况下把所有这些都塞住()