Cela dépend de votre JVM. Selon la spécification de la machine virtuelle Java c'est un comportement indéfini si l'objet n'est pas Throwable
.
Le objectref doit être de type référence et doit se référer à un objet qui est une instance de la classe Throwable ou d'une sous-classe de Throwable.
Dans la section 6.1, "Le Sens de "Doit"":
Si certaines contraintes (un "must" ou "ne doit pas") dans une instruction description n'est pas satisfait au moment de l'exécution, le comportement de la machine virtuelle Java n'est pas défini.
J'ai écrit un programme de test à l'aide de l' Jasmin assembleur qui fait l'équivalent d' throw new Object()
. La Java HotSpot Server VM jette un 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
La désactivation du bytecode verifier permet à l' athrow
d'exécuter et de la JVM semble se bloquer lorsqu'il essaie d'imprimer l'exception de détails. Comparer ces deux programmes, le premier qui jette un Exception
, la seconde qui est au-dessus de programme de test qui jette un Object
. Remarquez comment il se ferme au moyen d'une copie d'écran:
# 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" #
Bien sûr, la désactivation du bytecode verifier est dangereux. La VM est une bonne écrite de supposer que le bytecode de la vérification a été effectuée et n'a donc pas à typecheck instruction des opérandes. Attention: le comportement non défini que vous appelez lorsque vous contourner de vérification de bytecode est un peu comme le comportement non défini dans les programmes C; rien du tout peut arriver, y compris les démons volant de votre nez.