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

问题描述

这是 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中有两种异常:

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

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