为什么编译器批准但JVM不能运行的代码



这是Head First Java中的一个练习。练习是关于自动装箱(包装和展开(。

为什么编译器批准将Integer i(默认值为null(赋值给int j(默认值是0(?

当我运行它时,它显示:";无法调用";java.lang.Integer.intValue(("因为";这个;为空";

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中有两种类型的异常:
  1. 运行时异常-在运行时发生
  2. 编译时异常-发生在编译时

程序引发的异常是运行时异常,这就是程序成功编译但由于运行时异常而失败的原因。

最新更新