Java-Ausnahme StackTrace wird im Neuzustand ermittelt

Ich habe den folgenden Code geschrieben, der "neue Ausnahmen im Voraus und wiederverwendet".

package exceptiontest;

public class ExceptionTest {
    
    //Generieren Sie hier eine Ausnahme.
    private static final RuntimeException _e = new RuntimeException("hello"); // line: 6

    public static void main(String[] args) {
        //Es ist hier, um tatsächlich zu werfen.
        throw _e; // line: 10
    }
}

Das Ergebnis ist ...

Exception in thread "main" java.lang.RuntimeException: hello
	at exceptiontest.ExceptionTest.<clinit>(ExceptionTest.java:6)

Warum?

Java scheint StackTrace zu bestimmen, wenn es eine Instanz von Exception erstellt.

Für Python erscheint StackTrace, wenn Raise ( throw) fertig ist, also habe ich es mit dem gleichen Gefühl geschrieben.

Zum Beispiel, selbst wenn Sie den Code wie folgt umschreiben ...

package exceptiontest;

public class ExceptionTest {
    
    //Generieren Sie hier eine Ausnahme.
    private static final RuntimeException _e = new RuntimeException("hello"); // line: 6
    
    private static void f1() {
        f2();
    }
    
    private static void f2() {
        throw _e;
    }

    public static void main(String[] args) {
        // main() --> f1() --> f2() --> throw _e
        f1();
    }
}

In Zeile 6 wird ein StackTrace angezeigt, der für Exception immer neu ist.

Exception in thread "main" java.lang.RuntimeException: hello
	at exceptiontest.ExceptionTest.<clinit>(ExceptionTest.java:6)

<clinit> ist ein statischer Initialisierer für eine Klasse. Da die Variable _e als statisches Element der Klasse deklariert ist, wird die StackTrace bestimmt, wenn die ExceptionTest Klasse geladen wird.

Bonus (für Python)

Es funktioniert wie erwartet (?).

_e = Exception('hello')

def f1():
    raise _e

if __name__ == '__main__':
    f1()
Traceback (most recent call last):
  File "/Users/username/Documents/workspace/raisetest/main.py", line 7, in <module>
    f1()
  File "/Users/username/Documents/workspace/raisetest/main.py", line 4, in f1
    raise _e
Exception: hello

Recommended Posts

Java-Ausnahme StackTrace wird im Neuzustand ermittelt
Unerwartete Ausnahme bei Verwendung von DateTimeFormatter in Java
[Java] Was ist die Ausnahme für gleichzeitige Änderungen?
Was ist java
[Java] Ausnahmeinstanz
Was ist Java <>?
Java1.8 neue Funktionen
Was ist java
[Java] Ausnahmebehandlung
☾ Java / Ausnahmebehandlung
Informationen zur Behandlung von Java-Ausnahmen
Behandlung von Java-Ausnahmen
Zusammenfassung der neuen Funktionen von Java 12
Zusammenfassung der neuen Funktionen von Java 13
[Java] Wirf eine Ausnahme aus
Ausnahme beim Schließen von Try-with-Resources
Was ist Java-Kapselung?
[Nicht gelöst] Eine Ausnahme tritt auf, wenn eine SSH-Verbindung mit JSch aus einer Java 6-App ausgeführt wird.
Was ist Java-Technologie?
Was ist Java API-Java?
Was ist neu in Java 8?
[Java] Was ist flatMap?
Zusammenfassung der neuen Funktionen von Java 10
[Java] Was ist ArrayList?
Zusammenfassung der neuen Funktionen von Java 14
Was ist neu in Java 9,10,11
Bei Verwendung von ExpandableListView mit einem Fragment tritt eine Ausnahme auf, wenn die Vererbung ListFragment lautet.