为什么在Java中你可以抛出任何东西?

9
在Java中,理论上你只能抛出Throwables。这是语言允许的,并在类加载期间进行检查。但如果禁用类检查,你可以抛出任何类型的异常。
java -Xverify:none -cp . BadClassThatCompiles

然后,您可以运行一个抛出任何类(不是派生自Throwable )的类(示例)。

为什么?

为什么会设计成这样...意思是一个虚拟机允许抛出对象和一个验证器必须过滤出错误的代码。好像某些代码可能是错误的。它不是代码,而是设计!

为什么?


3
为什么?禁用验证器为什么会让你做一些奇怪的事情? - Denys Séguret
2
为什么JVM允许抛出对象?! - Johanes Matian
@dystroy - 它允许您加载违反旨在保护JVM免受破坏的各种规则的字节码文件;例如,从不匹配预期返回类型的方法返回对象。这就像玩弄装有子弹的手枪...真是个糟糕的主意。 - Stephen C
1个回答

4
为什么要这样设计,也就是允许抛出对象的虚拟机和必须过滤错误代码的验证器。好像有些代码可能是错误的一样。问题不在于代码,而在于设计!
为什么?
简单来说,因为这种设计从几乎所有角度都有效。
那么替代方案是什么呢?
我想你必须有一种特殊的“东西”,它们不是为了被设计成类的实例而存在,而是专门用于抛出。
这将需要:
- 一种定义这些异常非对象的新语法 - 一整套新的类型规则来处理这些非对象(例如,它们不能与 Object 兼容赋值) - 等等。
归根结底,Java 语言将变得更加复杂,对程序员来说更难使用。最终达到的目的是什么?略微简化验证器的任务吗?
抱歉,但如果你把它推向其逻辑极限,这个想法是行不通的。

坦白地说,如果你禁用验证器可以破坏 JVM,又有谁在意呢?这就像抱怨你玩杂耍时可以开枪打自己一样。

为什么不允许在语言中抛出任何东西呢?这似乎是一个糟糕的设计/需求不匹配... - Johanes Matian
@JohanesMatian 我觉得不论你选择哪种编程语言,我都能找到许多技巧和绕过的方法。没有完美无缺的平台或语言。 - Mikita Belahlazau
@StephenC - 这个问题是:“为什么”。这非常有建设性。 - Johanes Matian
如建议所示,我已清除了评论线程(或者至少是我自己的部分)。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接