为什么你能用Java扔东西?

Joh*_*ian 9 java jvm jvm-hotspot

在Java中,理论上你只能抛出Throwables.

这是语言允许的,并在类加载期间进行检查.但是如果禁用类检查

java -Xverify:none -cp . BadClassThatCompiles
Run Code Online (Sandbox Code Playgroud)

那么你可以运行一个抛出任何类的类(不是派生自的Throwable)(例子)

为什么?

为什么这样设计..意味着允许抛出对象的虚拟机和必须过滤掉错误代码的验证器.好像有些代码可能是错的.这不是代码,而是设计!

为什么?

Ste*_*n C 4

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

为什么?

原因很简单,因为该设计几乎可以从所有角度进行设计。

那么替代方案会是什么?

我想你必须有一种特殊的“东西”,它不是专门为抛出而设计的类的实例。

这需要:

  • 用于定义这些异常非对象的新语法
  • 一套全新的类型规则来处理这些非对象(例如它们不能是赋值兼容的对象......)
  • 等等。

最终,Java 语言将变得更加复杂,并且对于程序员来说更难使用。目的是什么?稍微简化验证者的任务?

抱歉,但如果你从逻辑上得出结论,这个想法是行不通的。


坦率地说,谁在乎你是否可以通过禁用验证器来破坏 JVM。这就像抱怨如果你玩弄装满子弹的手枪,你可能会开枪自杀。