Это зависит от вашей реализации JVM. Согласно спецификации Java VM это неопределенное поведение, если объект не Throwable
.
Objectref должно иметь ссылку на тип и должно ссылаться на объект, который является экземпляром класса Throwable или подкласса Throwable.
В разделе 6.1, «Значение слова« должен »» :
Если какое-либо ограничение («должен» или «не должен») в описании инструкции не выполняется во время выполнения, поведение виртуальной машины Java не определено.
Я написал тестовую программу, используя Jasmin ассемблер , который эквивалентен throw new Object()
. Виртуальная машина Java HotSpot Server выдает 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" #
Конечно, отключение верификатора байт-кода опасно. Собственно виртуальная машина написана так, чтобы предполагать, что проверка байт-кода была выполнена, и, следовательно, нет необходимости проверять операнды инструкций. Осторожно: неопределенное поведение, которое вы вызываете, когда обходите проверку байт-кода, очень похоже на неопределенное поведение в программах на Си; может произойти все что угодно, включая демонов, вылетающих из вашего носа.