当前位置: 首页 > 面试题库 >

您可以使用Java扔什么?

谭学名
2023-03-14
问题内容

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

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


问题答案:

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

objectref 必须 是引用类型,并且必须引用Throwable类或Throwable子类的实例的对象

在第6.1节“必须”的含义中:

如果在运行时不满足指令描述中的某些约束(“必须”或“不得”),则Java虚拟机的行为未定义。

我使用Jasmin汇编器编写了一个测试程序,该程序等效于throw new Object()。Java HotSpot服务器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

禁用字节码验证程序将允许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" #

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



 类似资料:
  • 问题内容: 我读过,可以使用COM / ActiveX自动执行Crystal Reports中的月度报告。我不太了解这是什么,甚至可以使用它来做什么。 我也使用Excel进行了大量工作,看起来您也使用COM / ActiveX与其进行交互。 有人可以解释它是如何工作的,也许可以提供一个简短的例子? 问题答案: 首先,您必须安装出色的pywin32模块。 它提供COM支持。您需要运行该实用程序。它位

  • 问题内容: 我开始学习Python,并且遇到过生成器函数,这些函数中包含yield语句。我想知道这些功能确实可以解决哪些类型的问题。 问题答案: 生成器为您提供懒惰的评估。您可以通过遍历它们来使用它们,可以显式地使用“ for”,也可以隐式地将其传递给任何迭代的函数或构造。您可以将生成器视为返回多个项目,就像它们返回一个列表一样,但是与其一次一次返回它们而不是一次全部返回它们,而是将生成器功能暂停

  • 在Java理论上,您只能抛出。 这是语言允许的,并在类加载期间进行检查。但是如果您禁用类检查 然后,您可以运行一个抛出任何类(不是从派生的)的类(示例) 为什么? 为什么要这样设计...意味着一个允许抛出对象的虚拟机和一个必须过滤掉错误代码的验证器。好像有些代码可能是错误的。这不是代码,这是设计! 为什么?

  • 问题内容: 您需要使用某种提供程序吗? 您可以设置自己的SMS服务器吗? 是否存在任何开源解决方案? 我是SMS的新手,因此,对于如何实现此目标的任何见解都会很棒。我偏爱Java,但是任何语言都可以。 问题答案: 这很简单。是的,您需要一个“ sms网关”提供程序。那里有很多东西。这些公司为您提供用于发送/接收SMS的API。 例如,德国Mobilant公司提供了简单的API。如果要接收SMS,只

  • 已弃用。这种方法本质上是不安全的。使用thread.Stop停止线程会导致它解锁它锁定的所有监视器(作为未检查的ThreadDeath异常向堆栈上传播的自然结果)。如果以前由这些监视器保护的任何对象处于不一致的状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。stop的许多用法应该被简单修改某个变量以指示目标线程应该停止运行的代码所取代。目标线程应该定期检查这个变量,如果变量指示它要停止运

  • 问题内容: 是否可以在GWT客户端中使用Java反射api?我想使用反射来查找Javabean上属性的值。这可能吗? 问题答案: 我去过那里,解决方案的确是使用Deferred Binding和Generators。您可以在此处看到使用生成器来克服GWT客户端中缺少反射的问题: http://jpereira.eu/2011/01/30/wheres-my-java- reflection/ 希望