在android中,即使第一个块的值为true,也会评估OR块

时间:2018-10-30 11:50:49

标签: java android

以下代码崩溃。似乎在android中,即使第一个块的评估结果为“ true”,IF OR块也会得到评估。

TileItem ti=null;
...
// code which initialises reference ti 

if (ti == null || !ti.isValid()){
    ...
}

在功能块中,我将TileItem的对象初始化为ti,然后在ti不为null且有效的情况下进行一些操作。 idvalid()正在验证TileItem对象的某些属性。但是我崩溃了,崩溃日志说

  

致命异常:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'boolean xxx.TileItem.isValid()'

我在这里找不到问题,有人遇到过这样的问题吗?

2 个答案:

答案 0 :(得分:2)

代码完全正确

if (ti == null || !ti.isValid()) { ... }

空指针异常必须涉及其他问题;例如isValid内。

答案 1 :(得分:0)

来自documentation

  

条件或运算符||
在运行时,左侧操作数   首先评估表达式;如果结果为布尔类型,则为   进行拆箱转换。
如果结果是   true,则条件或表达式的值为true,并且   右手操作数表达式不求值。

因此,如果tinull,则不会评估!ti.isValid(),因此不会有问题。
但是,如果ti不是null,那么!ti.isValid()却不会抛出NPE,因为ti不是null
所以也许异常抛出在其他地方。