12
votes

Pourquoi "Java.lang.outofMemoryError: Espace de tas Java" n'est-il pas attrapé?

J'ai un fil dans une application Web Java qui provoque une java.lang.outofmemororyError: espace de tas Java exception, mais le bloc Type / Catch n'atteint pas l'erreur.

Exemple de code: xxx

sortie: xxx

Contexte:

J'ai récemment repris ce projet Java et j'essaie de vous mettre au courant de Java et de ce projet. Je suis un développeur C #, je ne suis donc 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 afin que je puisse la connecter. L'erreur ne figure dans aucun des fichiers journaux et la sortie est affichée dans la console en mode de débogage dans Eclipse.


0 commentaires

5 Réponses :


41
votes

parce que OutofMemoryError est un Erreur , pas un Exception . Etant donné que OutofMemoryError n'est pas une sous-classe de Exception , la touche (exception e) ne s'applique pas.

OutofMemoryError EXTENDRE jetable , cependant, vous devriez donc être capable de l'attraper. Voici un So Discussion sur quand (si jamais), vous devriez prendre des erreurs. Généralement, puisque vous ne pouvez rien faire à ce sujet, la recommandation est de ne pas prendre la peine d'attraper des erreurs dans le code de production. Mais étant donné un cas particulier où vous essayez de déboguer ce qui se passe, cela pourrait être utile.


2 commentaires

Belle réponse avec des références de liaison. Je l'apprécie, merci!


Je recommanderais de capturer des jets dans la partie la plus extérieure de votre application (ou dans la partie la plus extérieure d'une méthode de thread) afin de pouvoir savoir pourquoi votre programme a aborti (s'il n'y a personne d'autre qui va le faire pour vous) .



3
votes

une "~ erreur" n'est pas une "exception".

Vous devez attraper "erreur" ou "jetable"


0 commentaires

2
votes

OutofMemoryError s'étend VirtualMachineError tandis que l'exception s'étend directement versable. Donc, il n'est pas attrapé selon les spécifications Java. Si vous cherchez à attraper toutes les exceptions, ajoutez des captures (jette e) à la clause et vous l'aurez.


2 commentaires

Pour être plus précis, OutofMemoryError s'étend VirtualMachineError, qui étend une erreur, et comme les erreurs ne sont pas des exceptions, une prise (exception) ne peut pas l'attraper


Bingo. Pensé à énumérer l'arbre entier mais a été paresseux :)



12
votes

java.lang.outofMemoryloryError ne prolonge pas java.lang.exception donc ce n'est pas une exception. OutofMemoryError s'étend java.lang.error. Si vous souhaitez 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());

     }
}


0 commentaires

0
votes

Ce que je ferai d'habitude, c'est ajouter une "inconceptionExceptionDharler" à un thread, donc si quelque chose vous fuit au moins avoir une chance de connecter le problème et peut-être faire un certain nettoyage.


0 commentaires