gpt4 book ai didi

java - Sun 的 javac 产生的奇怪异常表条目

转载 作者:IT老高 更新时间:2023-10-28 20:22:58 26 4
gpt4 key购买 nike

鉴于这个程序:

class Test {
public static void main(String[] args) {
try {
throw new NullPointerException();
} catch (NullPointerException npe) {
System.out.println("In catch");
} finally {
System.out.println("In finally");
}
}
}

Sun 的 javac (v 1.6.0_24) 产生以下字节码:

public static void main(java.lang.String[]);

// Instantiate / throw NPE
0: new #2; // class NullPointerException
3: dup
4: invokespecial #3; // Method NullPointerException."<init>":()V
7: athrow

// Start of catch clause
8: astore_1
9: getstatic #4; // Field System.out
12: ldc #5; // "In catch"
14: invokevirtual #6; // Method PrintStream.println
17: getstatic #4; // Field System.out

// Inlined finally block
20: ldc #7; // String In finally
22: invokevirtual #6; // Method PrintStream.println
25: goto 39

// Finally block
// store "incomming" exception(?)
28: astore_2
29: getstatic #4; // Field System.out
32: ldc #7; // "In finally"
34: invokevirtual #6; // Method PrintStream.println

// rethrow "incomming" exception
37: aload_2
38: athrow

39: return

有以下异常(exception)表:

  Exception table:
from to target type
0 8 8 Class NullPointerException
0 17 28 any
28 29 28 any


我的问题是:为什么它会在异常表中包含最后一个条目?!

据我了解,它基本上说“如果 astore_2 抛出异常,捕获它,然后重试相同的指令”。

即使使用空的 try/catch/finally 子句,也会产生这样的条目,例如

try {} catch (NullPointerException npe) {} finally {}

一些观察

  • Eclipse 编译器不会生成任何此类异常表条目
  • JVM 规范没有记录 the astore instruction 的任何运行时异常。 .
  • 我知道 JVM 为任何指令抛出 VirtualMachineError 是合法的。我猜这个特殊的条目可以防止任何此类错误从该指令传播出去。

最佳答案

只有两种可能的解释:编译器包含错误,或者它出于不明原因放置了一种水印。

该条目肯定是伪造的,因为由 finally block 本身引发的任何异常都必须将执行流发送到外部异常处理程序或 finally block ,但决不能“再次运行”同一个 finally block 。

此外,一个很好的证据表明它是一个错误/水印,事实是 Eclipse(可能还有其他 Java 编译器)没有生成这样的条目,即使如此 Eclipse 生成的类在 Sun 的 JVM 上也能正常工作。

也就是说,这篇文章很有趣,因为类文件似乎是有效且经过验证的。如果我是 JVM 实现者,我会忽略该条目并为 Sun/Oracle 填写一个错误!

关于java - Sun 的 javac 产生的奇怪异常表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com