这个Java代码如何编译而不会出错?

时间:2017-03-28 15:01:37

标签: java compiler-errors compilation javac

有人可以解释为什么这个Java代码会编译吗?

public class Main {
     public static void main(String []args){
        System.out.println(foo(true));
        System.out.println(foo(false));
     }

     public static boolean foo(boolean value) {
         // this should make the compiler say something, at least complain a bit...
         return value ? true : null;
     }
}

2 个答案:

答案 0 :(得分:1)

正如Oliver在评论中所说,编译的原因是自动装箱。

null可以自动装入Boolean,可以自动装箱到boolean,让编译器感到满意。在运行时,自动装箱有效,但当它被取消装箱到boolean时,它会抛出NullPointerException

答案 1 :(得分:0)

我们有什么样的条件表达式(JLS 15.25)?

  • 显然不是数字条件表达式。
  • 布尔条件表达式需要两个类型为boolean的操作数,第3个操作数违反了null
  • 我们有一个reference conditional expression

对于引用条件表达式,表15.25-E指定boolean(2nd)和null(3rd)的组合确定完整表达式具有类型lub(Boolean,null)

对于运行时评估,这句话提供了所需的清晰度:

  

在运行时,首先计算条件表达式的第一个操作数表达式。如有必要,将对结果执行取消装箱转换。

根据第一个操作数,会发生以下情况之一:

  • true自动退回到Boolean
  • null已经与Boolean兼容(基于JLS-4.1)(这不是其他答案所声称的自动装箱)< / LI>

生成的Boolean将被自动装箱,在第二种情况下会抛出NullPointerException