如果(a!=null && a instanceof A) ... 或者 如果(a instanceof A)

10

对于以下条件语句:

if (a != null && a instanceof A)
或者
if (a instanceof A)

首先检查null是否有任何优势(例如在性能方面)?两个条件语句的结果应该是相等的。

检查null是否有任何优势(例如在性能方面)?两个条件语句的结果应该是相等的。

5个回答

23

没有任何优势,你可以只用

if(a instanceof A) {}

如果 a 是 null,这将会评估为 false。


6
在运行时,如果RelationalExpression的值不为null且引用可以强制转换(§15.16)为ReferenceType而不会引发ClassCastException,则instanceof操作符的结果为true。否则结果为false。参见http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#80289 - barrowc
我从'97年开始编写Java程序,但这对我来说是新闻。谢谢,点赞! - Carl Smotricz

4
JVM需要自行检查是否为空,重复检查没有多大意义。

3

if(a instanceof A)足以满足需求。

a为null时,使用if(a!=null && expr)模式会抛出NullPointerException。而a instanceof A不会抛出NPE,如果a为null,则返回false


0

instanceOf运算符不需要显式的空值检查,因为如果操作数为null,它不会抛出空指针异常。

在运行时,如果关系表达式的值不为null且引用可以转换为引用类型而不引发类转换异常,则instanceOf运算符的结果为true。

如果操作数为null,则instanceOf运算符返回false,因此不需要显式的空值检查。

考虑下面的例子,

  public static void main(String[] args) {
             if(a != null && a instanceof ArrayList){                     //Violation
                        System.out.println("In if block");
             }
             else
                {
                     System.out.println("In else block");
                }
            }

instanceOf的正确用法如下所示:

 public static void main(String[] args) {
          
             if(a instanceof ArrayList){                     //Correct way
                      System.out.println("In if block");
             }
                else
              {
                     System.out.println("In else block");
             }
         }

在你的例子中,我认为没有必要使用 instanceof,因为你只是用它来执行 System.out::println。由于 instanceof 还验证类型,所以仅当你需要该类型验证以强制从方法返回类型等某些原因时,才有用使用它进行 null 检查。 - djangofan

0

我非常怀疑先检查 null 是否有任何好处。这取决于虚拟机如何实现 instancof 检查... 可能性很大它会在代码的第一部分自行执行 if 语句。


1
这不是由虚拟机决定的。这是语言规范,"null类型"只有一个值:null引用。null引用是"null类型"的一种,因此上述检查对于任何其他类型都返回false。 - naikus
虚拟机必须实现代码,而且很可能它要做的第一件事就是检查 null 值,因此将检查放在其中并不会提高性能。结果已经指定,如何实现结果则没有规定。 - TofuBeer
@TofuBeer 行为已被确定。必须 检查 null 值。它与任何实现无关。 - user207421
是的,它必须检查它是否为空。但它不一定要是它执行的第一件事... - TofuBeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接