问题描述
这是 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);
}
}
解决方法
Integer i
是对象引用的声明。对象引用被隐式初始化为 null
。因此,您在运行时会得到一个 NullPointerException
。
编译器不会抱怨,因为变量既没有声明为 private
也没有声明为 final
,所以它可能在运行时从这个类的外部被尚未编写的代码初始化。因此,编译器无法将此检测为错误或警告。
因此,您应该限制变量的可见性。如果添加 private
关键字,编译器将发出警告。
java中有两种异常:
- 运行时异常 - 在运行时发生
- 编译时异常 - 发生在编译时
您的程序抛出的异常是运行时异常,这就是您的程序编译成功但由于运行时异常而失败的原因。