【问题标题】:NullPointerException in ternary expression with null Long带有 null Long 的三元表达式中的 NullPointerException
【发布时间】:2011-12-15 02:41:57
【问题描述】:

为什么下面这行代码会产生NullPointerException

Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;

我知道正在对 null 执行拆箱,但为什么呢?

注意

Long v = (Long) null;

不产生异常。

【问题讨论】:

  • 你做了一个 v=((1==2)?Long.MAX_VALUE : (Long) null);这总是错误的,所以你总是尝试将 null 转换为 Long。这似乎是不允许的,会抛出你的异常。
  • 为什么会有这样一行代码?求知欲还是来自实际生产代码的 sn-p?
  • @Paul 和 evildead,看起来像是演示拆箱顺序的示例代码。
  • 相关:stackoverflow.com/questions/3882095/… 解决方案是将演员表移动到您的Long.MAX_VALUE,因为它会返回long

标签: java nullpointerexception


【解决方案1】:

所以很明显,你只需要在条件为真时装箱,而在条件为假时不应该装箱。但是,三元运算符表达式必须具有特定的 static 类型。所以我们有Longlong。 JLS 声明结果将是原始的(同样——想象一下,如果运算符是 + 甚至 ==)。所以三元运算符会强制拆箱,只有这样赋值才会导致装箱。

如果您要用等效的if-else 替换代码,那么您只需分配从longLong 和从LongLong,这不会有任何拆箱所以运行良好。

IIRC,涵盖的是 Bloch & Gafter 的 Java Puzzlers。

【讨论】:

    【解决方案2】:

    来自JSL

    1. 如果第二个和第三个操作数的类型相同(可能是 null 类型),那么这就是条件表达式的类型。
    2. 如果第二个和第三个操作数之一的类型为boolean,而另一个的类型为Boolean,则 条件表达式为boolean

    在下面的语句中,第二个操作数的类型是long,第三个是Long

    Long v = 1 == 2 ? Long.MAX_VALUE :  (Long) null;
    

    如果表达式为真,这将起作用。

    Long v= 1 == 1 ?  Long.MAX_VALUE : (Long) null;
    

    或者你可以施放它。

    Long v= 1 == 2 ?  Long.valueOf(Long.MAX_VALUE) : (Long) null;
    

    【讨论】:

    • 是的,我知道它正在拆箱,而且您不能将 null 拆箱。我在问为什么在这种情况下它试图执行拆箱。
    • 这并不完全正确。他试图拆箱一个空的Long 对象;演员不是问题。您可以将null 强制转换为任何类型的对象,请参阅Java 语言规范section 5.5,在“如果对引用类型的强制转换不是编译时错误,有几种情况:”
    猜你喜欢
    • 1970-01-01
    • 2015-02-28
    • 2023-02-03
    • 2023-03-31
    • 2021-11-23
    • 2011-03-11
    • 2014-09-15
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多