Pourquoi "à java.lang.OutOfMemoryError: Java heap space " not caught?

j'ai un thread dans une application Web Java qui provoque un java.lang.OutOfMemoryError: Java heap space exception, mais le bloc try/catch ne capte pas l'erreur.

code échantillon:

private void doSomeWork()
{
     try
     {
         processData();  //Causes OutOfMemoryError
         System.out.println("This line does not execute");
     }
     catch (Exception e)
     {
         System.out.println("Exception.  This line does not execute.");
         //Log error
     }
     finally
     {
         System.out.println("finally.  This line does execute");
         System.out.println("Thread name: " + Thread.currentThread().getName());

     }
}

sortie:

finally.  This line does execute 
Thread name: _Worker-8
Exception in thread "_Worker-8" java.lang.OutOfMemoryError: Java heap space
...

Contexte:

j'ai récemment repris ce projet Java et je suis j'essaie de me mettre à jour avec Java et ce projet. Je suis un développeur C#, donc je ne suis pas encore familier avec ce projet ou Java. Je sais que je peux corriger l'erreur en utilisant le paramètre-Xmx, mais je suis intéressé à attraper cette erreur pour que je puisse l'enregistrer. L'erreur n'apparaît dans aucun des fichiers journaux, et la sortie est affichée dans la console en mode de débogage dans Eclipse.

9
demandé sur Crispy 2009-12-11 17:56:02

5 réponses

parce que OutOfMemoryError est un Error , pas un Exception . Étant donné que OutOfMemoryError n'est pas une sous-classe de Exception , le catch (Exception e) ne s'applique pas.

OutOfMemoryError ne s'étendent Throwable , toutefois, si vous devez être en mesure de l'attraper. Voici un si discussion sur quand (si jamais) vous devriez attraper des erreurs. En général, puisque vous ne pouvez rien faire. à ce sujet, la recommandation est de ne pas prendre la peine de détecter les erreurs dans le code de production. Mais étant donné un cas spécial où vous essayez de déboguer ce qui se passe, ça pourrait être utile.

40
répondu Kaleb Brasee 2017-05-23 11:54:16

de java.lang.OutOfMemoryError n'étend pas java.lang.Exception donc ce n'est pas une Exception. OutOfMemoryError étend java.lang.Erreur. Si vous voulez attraper une erreur, essayez ceci:

private void doSomeWork()
{
     try
     {
         processData();  //Causes OutOfMemoryError
         System.out.println("This line does not execute");
     }
     catch (Error e)
     {
         System.out.println("Exception.  This line does not execute.");
         //Log error
     }
     finally
     {
         System.out.println("finally.  This line does execute");
         System.out.println("Thread name: " + Thread.currentThread().getName());

     }
}

Remarque: à l'Exception d'Erreur et s'étend Throwable de sorte que vous vous pouvez également utiliser Throwable attraper.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html

11
répondu Massimo Fazzolari 2009-12-11 15:03:15

"~d'Erreur" n'est pas un "~Exception".

vous devez attraper "erreur" ou" Lancable "

3
répondu Dennis C 2015-04-30 05:17:50

OutOfMemoryError s'étend VirtualMachineError alors que l'Exception s'étend à Lancer directement. Il n'est donc pas capturé selon les spécifications Java. Si vous cherchez à saisir toutes les exceptions, ajoutez catch (Throwable e) à la clause et vous l'aurez.

2
répondu Daniil 2009-12-11 15:00:22

ce que je vais généralement faire est d'ajouter un 'UncaughtExceptionHandler' à un Thread donc si quelque chose fuit par vous au moins avoir une chance de log le problème et peut-être faire un peu de nettoyage.

0
répondu Javamann 2009-12-11 22:27:50