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.
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.
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
"~d'Erreur" n'est pas un "~Exception".
vous devez attraper "erreur" ou" Lancable "
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.
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.