【问题标题】:Java - null instanceof Object evaluates to both true and falseJava - null instanceof Object 评估为真和假
【发布时间】:2012-09-06 09:03:34
【问题描述】:

当我编译并运行这段代码时:

public class Testing {
    public static void main(String... args) {
        Object obj = null;
        if (obj instanceof Object) {
            System.out.println("returned true"); 
        } else {
            System.out.println("returned false"); 
        }
        System.out.println(" " + obj instanceof Object);
    }
}

我在命令行上得到这个:

C:\Users\xxxxxx\Desktop>java Testing
returned false
true

“null instanceof someType”不应​​该总是返回 false 吗?

【问题讨论】:

  • 类似的谜题; x + 0 != x 是什么时候?顺便说一句,您希望 + 具有更高的优先级。
  • 顺便说一句:当 java 打印 true 而不是 true 时,您可能会变得可疑
  • 我认为标题有点误导,除非这是 Java Quantum Edition 并且 instanceof 返回了一个 quboolean。
  • @Peter - 当 X 是 double/float NaN 或任何字符串时。
  • 你必须使用Java,薛定谔版

标签: java instanceof


【解决方案1】:

这个:

" " + obj instanceof Object

被评估为:

(" " + obj ) instanceof Object

" " + obj 确实是一个非空字符串,它是Object 的一个实例。

【讨论】:

  • 这是一个很好的教训,“当运算符的优先级不是很明显时,更多的括号比更少的更好。” " " + (obj instanceof Object) 会打印出您期望的值。
  • 好点。您可以在 Joshua Block 和 Neal Gafter 的 Java Puzzlers 中研究这种违反直觉的行为。
  • 我刚刚意识到并刷新并看到了您的答案:D
  • 如果你自己得到它会更好:)
  • @FabianBarney 是的,但运算符优先级位不仅仅适用于这种情况(当然,String.valueOf 也是如此)。例如,也许您想输出一条调试消息,"obj is a Foo? " + obj instanceof Foo。布尔逻辑是另一个很好的例子:a || b ? c : d 是什么意思?是(a || b) ? c : d 还是a || (b ? c : d)? Parens(或者更好的是,命名为 vars!)使代码变得不那么棘手。
【解决方案2】:

在最后一个System.out.println 中,首先计算" " + obj,然后检查String 的结果是否与instanceof Object 匹配并打印结果。

【讨论】:

    【解决方案3】:

    In (" " + obj) 是首先被评估的部分,因此括号后不再为 null。 所以它是Object的实例。

    另请参阅以下链接,以便您的概念清晰。

    http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多