是否可以在 Java 中构造一段代码,使假设的 java.lang.ChuckNorrisException 无法捕捉?

想到的想法是使用例如拦截器或 aspect-oriented programming

最佳答案

我没有试过这个,所以我不知道 JVM 是否会限制这样的东西,但也许你可以编译抛出 ChuckNorrisException 的代码,但在运行时提供 ChuckNorrisException 的类定义,它不扩展 Throwable。

更新:

它不起作用。它会生成 validator 错误:

Exception in thread "main" java.lang.VerifyError: (class: TestThrow, method: ma\
in signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestThrow.  Program will exit.

更新 2:

实际上,如果您禁用字节码 validator ,您就可以使用它! ( -Xverify:none )

更新 3:

对于那些在家跟随的人,这里是完整的脚本:

创建以下类:
public class ChuckNorrisException
    extends RuntimeException // <- Comment out this line on second compilation
{
    public ChuckNorrisException() { }
}

public class TestVillain {
    public static void main(String[] args) {
        try {
            throw new ChuckNorrisException();
        }
        catch(Throwable t) {
            System.out.println("Gotcha!");
        }
        finally {
            System.out.println("The end.");
        }
    }
}

编译类:
javac -cp . TestVillain.java ChuckNorrisException.java

运行:
java -cp . TestVillain
Gotcha!
The end.

注释掉“extends RuntimeException”并仅重新编译 ChuckNorrisException.java :
javac -cp . ChuckNorrisException.java

运行:
java -cp . TestVillain
Exception in thread "main" java.lang.VerifyError: (class: TestVillain, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestVillain.  Program will exit.

无需验证即可运行:
java -Xverify:none -cp . TestVillain
The end.
Exception in thread "main"

关于java - 无法捕捉的 ChuckNorrisException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13883166/

10-12 17:35