【发布时间】:2021-08-19 21:32:39
【问题描述】:
这是一个 Head First Java 练习。练习是关于自动装箱(包装和展开)。
为什么编译器同意将 Integer i(默认值为 null)分配给 int j(默认值为 0)?
当我运行它时,它显示:“无法调用“java.lang.Integer.intValue()”,因为“this.i”为空”
public class TestBox {
Integer i;
int j;
public static void main(String[] args) {
TestBox t = new TestBox();
t.go();
}
public void go() {
j = i;
System.out.println(j);
System.out.println(i);
}
}
【问题讨论】:
-
您的程序正在由 JVM 运行。它只是在运行时遇到错误。并非所有潜在错误都可以在编译时发现。运行时发生的错误是你必须忍受的。
-
编译器在编译时不知道任何值。通常允许将
Integer分配给int,因此编译器不会失败。在运行期间,程序会遇到问题,因为它无法将Integer的null值分配给int。有关在编译时和/或运行时可能发现的错误的更多详细信息,请查看@OHGODSPIDERS 参考。 -
编译器不关心默认值。它不跟踪值是什么或可能是什么。是的,自动拆箱是 NPE 可能发生的机会。呼叫
i.toString()也是如此。为了让编译器能够真正防止此类问题,您需要在类型系统中内置 nullity。例如Integer和Integer?(可空整数),like Kotlin has -
谢谢大家!!!
标签: java jvm autoboxing javacompiler