Java Exception StackTrace est déterminé lorsque nouveau

J'ai écrit le code suivant que "de nouvelles exceptions à l'avance et les réutiliser".

package exceptiontest;

public class ExceptionTest {
    
    //Générez une exception ici.
    private static final RuntimeException _e = new RuntimeException("hello"); // line: 6

    public static void main(String[] args) {
        //Il est ici pour lancer réellement.
        throw _e; // line: 10
    }
}

Le résultat est ...

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

Pourquoi?

Java semble déterminer StackTrace lorsqu'il crée une instance d'Exception.

Avec python, StackTrace apparaît lorsque vous faites lever '' ( lancer ''), donc je l'ai écrit avec le même sentiment.

Par exemple, même si vous réécrivez le code comme suit ...

package exceptiontest;

public class ExceptionTest {
    
    //Générez une exception ici.
    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();
    }
}

Vous verrez un StackTrace sur la ligne 6 qui est toujours nouveau dans Exception.

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

<clinit> '' est un initialiseur statique pour une classe. Puisque la variable _eest déclarée comme un élément statique de la classe, le StackTrace sera déterminé lorsque la classe `ʻExceptionTest est chargée.

Bonus (pour Python)

Cela fonctionne comme prévu (?).

_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 Exception StackTrace est déterminé lorsque nouveau
Exception inattendue lors de l'utilisation de DateTimeFormatter de Java
[Java] Qu'est-ce que l'exception de modification simultanée?
Qu'est-ce que 'java
[Java] Instance d'exception
Qu'est-ce que Java <>?
java1.8 nouvelles fonctionnalités
Qu'est-ce que 'java
[Java] Gestion des exceptions
☾ Java / Gestion des exceptions
À propos de la gestion des exceptions Java
Gestion des exceptions Java
Résumé des nouvelles fonctionnalités de Java 12
Résumé des nouvelles fonctionnalités de Java 13
[java] Lancer une exception
Exception lors de la fermeture de try-with-resources
Qu'est-ce que l'encapsulation Java?
[Non résolu] Une exception se produit lorsqu'une connexion SSH est exécutée à l'aide de JSch à partir d'une application Java 6.
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
Nouveautés de Java 8
[Java] Qu'est-ce que flatMap?
Résumé des nouvelles fonctionnalités de Java 10
[Java] Qu'est-ce que ArrayList?
Résumé des nouvelles fonctionnalités de Java 14
Nouveautés de Java 9,10,11
Lorsque vous utilisez ExpandableListView avec un fragment, une exception se produit lorsque l'héritage est ListFragment.