Ist es möglich, einen Codeschnipsel zu konstruieren in Java Das würde eine hypothetische java.lang.ChuckNorrisException
uneinholbar?
Denkbar wären zum Beispiel die Verwendung von Abfangjägern oder aspektorientierte Programmierung .
Ist es möglich, einen Codeschnipsel zu konstruieren in Java Das würde eine hypothetische java.lang.ChuckNorrisException
uneinholbar?
Denkbar wären zum Beispiel die Verwendung von Abfangjägern oder aspektorientierte Programmierung .
Ich habe das nicht ausprobiert, weiß also nicht, ob die JVM würde so etwas einschränken, aber vielleicht könnten Sie Code kompilieren, der ChuckNorrisException
, sondern zur Laufzeit eine Klassendefinition von ChuckNorrisException
que erweitert Throwable nicht .
UPDATE :
Das funktioniert nicht. Es wird ein Prüffehler erzeugt:
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:
Sie können dies sogar erreichen, wenn Sie die Bytecode-Überprüfung deaktivieren! ( -Xverify:none
)
UPDATE 3:
Für diejenigen, die die Sendung von zu Hause aus verfolgen, 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
Laufen:
java -cp . TestVillain
Gotcha!
The end.
Kommentieren Sie "extends RuntimeException" aus und neu kompilieren ChuckNorrisException.java
nur :
javac -cp . ChuckNorrisException.java
Laufen:
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"
Nachdem ich darüber nachgedacht habe, habe ich erfolgreich eine nicht abfangbare Ausnahme erstellt. Ich habe sie so benannt JulesWinnfield
Allerdings eher als Chuck, denn er ist eine Pilz-Wolken-legende-Mutter-Ausnahme. Außerdem ist es vielleicht nicht genau das, was Sie sich vorgestellt haben, aber es kann sicher nicht gefangen werden. Beobachten Sie:
public static class JulesWinnfield extends Exception
{
JulesWinnfield()
{
System.err.println("Say 'What' again! I dare you! I double dare you!");
System.exit(25-17); // And you shall know I am the LORD
}
}
public static void main(String[] args)
{
try
{
throw new JulesWinnfield();
}
catch(JulesWinnfield jw)
{
System.out.println("There's a word for that Jules - a bum");
}
}
Et voila! Ungefangene Ausnahme.
Ausgabe:
laufen:
Sag noch einmal 'Was'! Ich fordere dich heraus! Ich fordere dich doppelt heraus!
Java Ergebnis: 8
BUILD SUCCESSFUL (Gesamtzeit: 0 Sekunden)
Wenn ich etwas mehr Zeit habe, werde ich sehen, ob mir nicht auch etwas anderes einfällt.
Sehen Sie sich auch dies an:
public static class JulesWinnfield extends Exception
{
JulesWinnfield() throws JulesWinnfield, VincentVega
{
throw new VincentVega();
}
}
public static class VincentVega extends Exception
{
VincentVega() throws JulesWinnfield, VincentVega
{
throw new JulesWinnfield();
}
}
public static void main(String[] args) throws VincentVega
{
try
{
throw new JulesWinnfield();
}
catch(JulesWinnfield jw)
{
}
catch(VincentVega vv)
{
}
}
Verursacht einen Stapelüberlauf - auch hier bleiben die Ausnahmen unentdeckt.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.