603 Stimmen

Unfangbare ChuckNorrisException

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 .

320voto

jtahlborn Punkte 51903

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"

122voto

Mike G Punkte 4142

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.

85voto

Korgen Punkte 5071

Mit einer solchen Ausnahme wäre es natürlich obligatorisch, eine System.exit(Integer.MIN_VALUE); aus dem Konstruktor zu entfernen, denn das ist es, was passieren würde, wenn Sie eine solche Ausnahme auslösen würden ;)

46voto

Nathan Hughes Punkte 90344

Jeder Code kann Throwable abfangen. Also nein, jede Ausnahme, die Sie erstellen, wird eine Unterklasse von Throwable sein und kann abgefangen werden.

35voto

fluffy Punkte 4750
public class ChuckNorrisException extends Exception {
    public ChuckNorrisException() {
        System.exit(1);
    }
}

(Zugegeben, technisch wird diese Ausnahme nie tatsächlich ausgelöst, sondern eine richtige ChuckNorrisException kann nicht geworfen werden - es wirft dich zuerst.)

CodeJaeger.com

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.

Powered by:

X