gpt4 book ai didi

java - 你能在 Java 中抛出什么?

转载 作者:IT老高 更新时间:2023-10-28 20:21:27 24 4
gpt4 key购买 nike

传统观点认为,您只能在 Java 中抛出扩展 Throwable 的对象,但是否可以禁用字节码 validator 并让 Java 编译和运行抛出任意对象甚至原语的代码?

我查找了 JVM 的 athrow它将弹出操作数堆栈上的第一个 objref;但它会在运行时检查所述引用是否指向 Throwable 吗?

最佳答案

这取决于您的 JVM 实现。根据 Java VM 规范,如果对象不是 Throwable,则为未定义行为。

The objectref must be of type reference and must refer to an object that is an instance of class Throwable or of a subclass of Throwable.

section 6.1, "The Meaning of 'Must'" :

If some constraint (a "must" or "must not") in an instruction description is not satisfied at run time, the behavior of the Java virtual machine is undefined.

我使用 Jasmin assembler 编写了一个测试程序这相当于 throw new Object()。 Java HotSpot Server VM 抛出 VerifyError:

# cat Athrow.j 
.source Athrow.j
.class public Athrow
.super java/lang/Object

.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method

.method public static main([Ljava/lang/String;)V
.limit stack 2

new java/lang/Object
dup
invokenonvirtual java/lang/Object/<init>()V
athrow

return
.end method

# java -jar jasmin.jar Athrow.j
Generated: Athrow.class

# java Athrow
Exception in thread "main" java.lang.VerifyError: (class: Athrow, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objects

禁用字节码 validator 允许 athrow 执行,当 JVM 尝试打印异常的详细信息时,它似乎崩溃了。比较这两个程序,第一个抛出一个Exception,第二个是上面的测试程序抛出一个Object。注意它是如何在打印输出中间退出的:

# java -Xverify:none examples/Uncaught
Exception in thread "main" java.lang.Exception
at examples.Uncaught.main(Uncaught.j)
# java -Xverify:none Athrow
Exception in thread "main" #

当然,禁用字节码 validator 是危险的。编写 VM 本身以假定已执行字节码验证,因此不必对指令操作数进行类型检查。注意:绕过字节码验证时调用的未定义行为很像 C 程序中的未定义行为;任何事情都有可能发生,包括从你 Nose 里飞出来的恶魔。

关于java - 你能在 Java 中抛出什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5749898/

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