当前位置: 首页 > 知识库问答 >
问题:

为什么你能用Java扔东西?[闭门]

欧阳博文
2023-03-14

在Java理论上,您只能抛出Throwables

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

java -Xverify:none -cp . BadClassThatCompiles

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

为什么?

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

为什么?

共有1个答案

羊舌新荣
2023-03-14

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

为什么?

仅仅是因为设计几乎从所有角度都有效。

那么替代方案是什么?

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

这将需要:

  • 定义这些异常非对象的新语法

说到底,Java语言会更复杂,程序员也更难使用。为了什么?稍微简化验证者的任务?

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

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

 类似资料:
  • 问题内容: 传统观点认为,您只能抛出在Java 中扩展的对象,但是是否可以禁用字节码验证程序并让Java编译并运行抛出任意对象(甚至是原语)的代码? 我查找了JVM ,它将弹出操作数堆栈中的第一个objref。但是会检查所述引用是否指向运行时? 问题答案: 这取决于您的JVM实现。根据Java VM规范,如果对象不是,则它是未定义的行为。 objectref 必须 是引用类型,并且必须引用Thro

  • 我希望下面的代码在上引发一个编译时错误,因为没有声明为throw,但它编译成功(在Java 1.7.0_45中),并生成您希望的输出,如果该编译时错误得到修复的话。 如果更改为,它也会进行编译。 这并不像预期的那样编译: 这将编译: 这并不是:

  • 问题内容: 我想浏览Mongoose存储在Mongodb中的原始数据。去哪儿了?我有一个名为Profile的模式,其中存储了多个配置文件,但是使用Mongodb shell ,并且不返回任何内容。 架构 问题答案: 使用Mongoose时的默认集合名称是小写的复数模型名称。 因此,如果要为as 创建模型: 集合名称是; 因此您将在shell中找到其内容。 请注意,如果您不喜欢默认行为,则可以提供自

  • 通常,要关闭Android设备的电源,当然要通过电源按钮。 您还可以执行和。 但在Android系统中,我看不到关闭设备的方法。如果没问题的话,我很想把树莓圆周率的功率切断,但这可以接受吗?它会损坏SD卡吗?

  • 目前我在灰熊2.3.16和泽西2.14工作。我试图得到一个自定义异常处理的服务器和返回到客户端。相反,我似乎得到了通用的灰熊错误,即使正确的代码似乎被调用。 这是筛选器方法(具有“@Provider”装饰的类的一部分)。 下面是整个ExceptionMapper实现: 下面是我如何得到回复并阅读的: 当我得到实体时,它是来自Grizzly的HTML,而不是我的自定义消息。 这是调用toRespon

  • 您好,我目前正在处理HackerRank上的Java挑战,遇到了一个用我的代码无法解决的问题。 提示如下:, 给定一个字符串 s 和一个整数 k,完成该函数,以便它找到字典上长度 k 的最小和最大子字符串。 样本输入: welcometojava 3 示例输出: ava wel 最小和最大的子字符串仅基于第一个整数。因此,对于我的解决方案,我决定创建一个整数数组,并使用 String s 中每个可