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