我试图弄清楚提供不可用参数的方法调用是如何在代码的调用行上抛出异常的——在它到达方法行之前。 下面是一个例子
1. static Integer x;
2. public static void main(String args[]){
3. doStuff(x)} //null pointer exception thrown on this line
//lines 4-49
50. public static void doStuff(int z){}
在这里,我向该方法发送一个 Integer 对象引用,并且由于自动装箱,一个 Integer 对象是要发送的有效引用。 如果调用的方法直到第 50 行才加载到堆栈,为什么 JVM 在第 3 行还没有到达方法签名时抛出空指针异常?
最佳答案
因为 null
不是原始 int
的有效值。
您说得对,由于自动装箱,Integer
对象是接受原始 int
的方法的有效参数。但是,在您在此处描述的情况下,Integer
永远不会被初始化,因此将是 null
(Integer
对象的默认未初始化值,与int
的值,即 0)。
这意味着 JVM 尝试通过调用 null.intValue()
将 null
转换为原始 int
以便它适合被调用的方法 - 这就是 NPE 被抛出的地方。
仅供引用,在调用它的行下方声明该方法这一事实没有任何区别,因为 Java 不被解释,它被编译成字节码。
关于java - java方法如何在调用之前抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8124739/