Warum wird "java.lang.OutOfMemoryError: Java-Heap-Space" nicht abgefangen?

8

Ich habe einen Thread in einer Java-Webanwendung, der eine Ausnahme java.lang.OutOfMemoryError: Java-Heap-Space verursacht, aber der try / catch-Block fängt den Fehler nicht ab.

Beispielcode:

%Vor%

Ausgabe:

%Vor%

Hintergrund:

Ich habe dieses Java-Projekt kürzlich übernommen und versuche, mit Java und diesem Projekt Schritt zu halten. Ich bin ein C # -Entwickler, daher kenne ich dieses Projekt oder Java noch nicht. Ich weiß, dass ich den Fehler mit der Einstellung -Xmx beheben kann, aber ich bin daran interessiert, diesen Fehler zu erfassen, damit ich ihn protokollieren kann. Der Fehler wird in keiner der Protokolldateien angezeigt, und die Ausgabe wird in der Konsole im Debugmodus in Eclipse angezeigt.

    
Crispy 11.12.2009, 14:56
quelle

5 Antworten

39

Weil OutOfMemoryError ein Error ist , kein Exception . Da OutOfMemoryError keine Unterklasse von Exception ist, gilt catch (Exception e) nicht.

OutOfMemoryError erweitert Throwable , Sie sollten es jedoch fangen können. Hier ist eine SO-Diskussion , wenn (wenn überhaupt) Fehler auftreten sollten. Da Sie nichts dagegen tun können, sollten Sie keine Fehler im Produktionscode abfangen. Aber in einem speziellen Fall, wo Sie versuchen, zu debuggen, was vor sich geht, könnte es hilfreich sein.

    
Kaleb Brasee 11.12.2009, 14:58
quelle
11

java.lang.OutOfMemoryError erweitert java.lang.Exception nicht, so dass es keine Ausnahme ist. OutOfMemoryError erweitert java.lang.Error. Wenn Sie Fehler abfangen möchten, versuchen Sie Folgendes:

%Vor%

Hinweis: Exception and Error erweitert Throwable, sodass Sie Throwable auch zum Abfangen von beiden verwenden können.

Ссылка

    
Massimo Fazzolari 11.12.2009 15:03
quelle
3

Ein "~ Fehler" ist keine "~ Ausnahme".

Sie müssen "Error" oder "Throwable" fangen

    
Dennis C 11.12.2009 14:58
quelle
2

OutOfMemoryError erweitert VirtualMachineError, während Exception Throwable direkt erweitert. Es wird also nicht nach Java-Spezifikationen abgefangen. Wenn Sie alle Ausnahmen abfangen möchten, fügen Sie der Klausel catch (Throwable e) hinzu, und Sie haben es.

    
Daniil 11.12.2009 15:00
quelle
0

Was ich normalerweise tun werde, ist, einen 'UncaughtExceptionHandler' zu einem Thread hinzuzufügen. Wenn also irgendetwas ausbleibt, haben Sie zumindest die Möglichkeit, das Problem zu protokollieren und eventuell etwas aufzuräumen.

    
Javamann 11.12.2009 22:27
quelle

Tags und Links