Ich habe nicht versucht, damit ich weiß nicht , ob der JVM so etwas wie dies beschränken würde, aber vielleicht könnten Sie Code kompilieren , die werfen ChuckNorrisException
, sondern zur Laufzeit eine Klassendefinition zur Verfügung stelle von ChuckNorrisException
denen Throwable nicht erstreckt .
AKTUALISIEREN:
Es funktioniert nicht. Es wird ein Überprüfungsfehler generiert:
Exception in thread "main" java.lang.VerifyError: (class: TestThrow, method: ma\
in signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestThrow. Program will exit.
UPDATE 2:
Tatsächlich können Sie dies zum Laufen bringen, wenn Sie den Bytecode-Verifizierer deaktivieren! ( -Xverify:none
)
UPDATE 3:
Für diejenigen, die von zu Hause aus folgen, ist hier das vollständige Skript:
Erstellen Sie die folgenden Klassen:
public class ChuckNorrisException
extends RuntimeException // <- Comment out this line on second compilation
{
public ChuckNorrisException() { }
}
public class TestVillain {
public static void main(String[] args) {
try {
throw new ChuckNorrisException();
}
catch(Throwable t) {
System.out.println("Gotcha!");
}
finally {
System.out.println("The end.");
}
}
}
Klassen kompilieren:
javac -cp . TestVillain.java ChuckNorrisException.java
Lauf:
java -cp . TestVillain
Gotcha!
The end.
Kommentieren Sie "erweitert RuntimeException" aus und kompilieren Sie ChuckNorrisException.java
nur neu :
javac -cp . ChuckNorrisException.java
Lauf:
java -cp . TestVillain
Exception in thread "main" java.lang.VerifyError: (class: TestVillain, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestVillain. Program will exit.
Ohne Überprüfung ausführen:
java -Xverify:none -cp . TestVillain
The end.
Exception in thread "main"