为什么编译器认可的代码却不能被JVM运行?

Why the code that the compiler approves but cannot be run by JVM?

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

为什么编译器允许将整数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 所以它 可能 在运行时从这个 class 通过尚未编写的代码。因此编译器无法将此检测为错误或警告。

因此,您应该限制变量的可见性。如果您添加 private 关键字,编译器将发出警告。

java有两种异常:

  1. 运行时异常 - 发生在运行时
  2. 编译时异常 - 发生在编译时

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