为什么编译器认可的代码却不能被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有两种异常:
- 运行时异常 - 发生在运行时
- 编译时异常 - 发生在编译时
您的程序抛出的异常是运行时异常,这就是您的程序编译成功但由于运行时异常而失败的原因。
这是 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有两种异常:
- 运行时异常 - 发生在运行时
- 编译时异常 - 发生在编译时
您的程序抛出的异常是运行时异常,这就是您的程序编译成功但由于运行时异常而失败的原因。