Java8中的三元运算符,用Maven编译
Ternary operator in Java 8, compilation with Maven
考虑这个 class:
package be.duo.test;
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.execute();
}
private void execute() {
for(int i = 0; i < 10; i++) {
System.out.println("" + method());
}
}
private int method() {
return (Math.random() > 0.5d) ? 1 : null;
}
}
method() 具有 return 类型 int
,这是一个原始类型。
考虑 return 语句中使用的三元运算符:
- 它使用Java 8默认编译器编译,但这会导致运行时出现NullPointerException,为什么?
- 使用 Maven 这会导致编译时错误
[ERROR] error: incompatible types: bad type in conditional expression
[ERROR] <null> cannot be converted to int
谁能给我解释一下为什么它的行为不同?
不确定你使用的是哪个 Java 8 次要版本,但我可以在 java 1.8.
下编译
C:\Users\XXXX>javac -version
javac 1.8.0_31
C:\Users\XXXX>javac Main.java
C:\Users\XXXX>java Main
Exception in thread "main" java.lang.NullPointerException
at Main.method(Main.java:15)
at Main.execute(Main.java:10)
at Main.main(Main.java:5)
据我所知,在Java 8.
下应该是合法的
见Table 15.25-E. Conditional expression type (Reference 3rd operand, Part III):
3rd → null
2nd ↓
int lub(Integer,null)
lub(Integer,null)
应该是 Integer
。基本上,如果你有一个 boolean ? int : null
形式的条件,表达式的结果应该是 Integer
并且它被拆箱。 (我想你已经知道这是怎么回事了。)
所以根据规范应该是一样的。
似乎是编译器错误。已经发现了很多,我会说尝试更新到最新版本。
考虑这个 class:
package be.duo.test;
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.execute();
}
private void execute() {
for(int i = 0; i < 10; i++) {
System.out.println("" + method());
}
}
private int method() {
return (Math.random() > 0.5d) ? 1 : null;
}
}
method() 具有 return 类型 int
,这是一个原始类型。
考虑 return 语句中使用的三元运算符:
- 它使用Java 8默认编译器编译,但这会导致运行时出现NullPointerException,为什么?
- 使用 Maven 这会导致编译时错误
[ERROR] error: incompatible types: bad type in conditional expression
[ERROR] <null> cannot be converted to int
谁能给我解释一下为什么它的行为不同?
不确定你使用的是哪个 Java 8 次要版本,但我可以在 java 1.8.
下编译C:\Users\XXXX>javac -version
javac 1.8.0_31
C:\Users\XXXX>javac Main.java
C:\Users\XXXX>java Main
Exception in thread "main" java.lang.NullPointerException
at Main.method(Main.java:15)
at Main.execute(Main.java:10)
at Main.main(Main.java:5)
据我所知,在Java 8.
下应该是合法的见Table 15.25-E. Conditional expression type (Reference 3rd operand, Part III):
3rd → null
2nd ↓
int lub(Integer,null)
lub(Integer,null)
应该是 Integer
。基本上,如果你有一个 boolean ? int : null
形式的条件,表达式的结果应该是 Integer
并且它被拆箱。 (我想你已经知道这是怎么回事了。)
所以根据规范应该是一样的。
似乎是编译器错误。已经发现了很多,我会说尝试更新到最新版本。