2010-03-29 15 views
15

Können Sie versuchen, eine Stack-Overflow-Ausnahme in Java zu fangen? Es scheint sich so oder so zu werfen. Wenn meine Verfahren überlaufen, möchte ich diesen Wert "bestrafen".versuchen/fangen auf Stack-Überlauf in Java?

+12

Vorbeugen ist besser als Fang .... –

+4

Fang ist nützlich für das Debuggen :) – JonnyBoy

Antwort

22

scheint zu funktionieren:

public class Test { 

    public static void main(String[] argv){ 
     try{ 
      main(null); 
     } 
     catch(StackOverflowError e){ 
      System.err.println("ouch!"); 
     } 
    } 

} 
+1

Ah Ich war mit einer allgemeinen Ausnahme versuchen. Vielen Dank! – stereos

+0

Ich stimme zu, dass es besser wäre herauszufinden, was die Ausnahme verursacht und sie verhindert. – Thilo

+8

@stereos Du hast nicht versucht, 'Exception' zu fangen, warst du? 'Error' erweitert' Throwable' direkt, nicht durch 'Exception'. –

7

Wenn Sie einen Stapelüberlauf bekommen, Sie Funktion Anrufungen wahrscheinlich unendliche Rekursion versuchen oder stark zu missbrauchen. Vielleicht sollten Sie in Erwägung ziehen, einige Ihrer Prozeduren iterativ anstatt rekursiv zu machen oder zu überprüfen, ob in Ihrer rekursiven Prozedur ein korrekter Basisfall vorliegt. Eine Stapelüberlauf-Ausnahme zu fangen ist eine schlechte Idee; Sie behandeln die Symptome, ohne die zugrunde liegende Ursache anzugehen.

+0

Im Fall der Verwendung von Rekursion und Überlauf der gesetzten Optionen der JVM ist die SO eine normale negative Antwort eines korrekten Programms. Wir MÜSSEN es fangen und reagieren. Zum Beispiel könnten wir im Fall der Lazy Sequence, die durch eine rekursive Funktion (http://stackoverflow.com/a/33926444/715269) gesetzt wird, einfach in kleineren Schritten weitermachen. – Gangnus

+1

Abfangen der SO-Fehler ist auch nützlich für das Debuggen, wenn Sie nicht wissen, welche der vielen rekursiven Methoden verursacht die SO-Fehler :) –

0

Ich stimme Michael zu - StackOverflowException ist ein Signal, dass etwas sehr schief gelaufen ist. Schlucken ist keine gute Idee. Die beste Vorgehensweise besteht darin, die Ursache für diesen Fehler zu beheben.

+0

Wo der Fragesteller sagt, er will schlucken? Im Gegenteil, er möchte den Wert "bestrafen" – Gangnus

+0

Mein Verständnis ist, dass das OP StackOverflowException abfangen will, um einige benutzerdefinierte Logik (bestrafen) bei der Verarbeitung der Ausnahme bieten. Und wir sind zurück auf Platz eins, der lautet: "Man soll keine Fehler fangen". –

+0

Und ich wiederhole es noch einmal: Im Falle der Rekursion bekommt SO eine ganz andere Bedeutung: Sie sind zu tief gesprungen, wiederholen sich in flacheren Schritten. – Gangnus

4

Sie haben einen Fehler zu fangen, nicht die Ausnahme

2

Die funktionellen Eigenschaften von Java 8 diese Frage ungleich wichtiger macht. Während wir beginnen, Rekursion massiv zu verwenden, müssen wir auf StackOverflowException zählen.

Die Java 8-Lambdatypen haben keine StackOverflowException. Also müssen wir solche schaffen. Es ist absolut notwendig, ohne dass wir nicht einmal die IDE-Kontrolle bestehen.

Zum Beispiel Integer -> Integer-Funktion Typ könnte als aussehen:

@FunctionalInterface 
public interface SoFunction <U> { 
    public U apply(Integer index) throws StackOverflowException; 
} 

Danach haben wir eine Funktion schreiben können, die Lambda-Ausdrücke werfen Stackoverflow akzeptieren.

public T get(int currentIndex) throws StackOverflowException{ 

Und erst jetzt können wir eine rekursive Lambda erstellen:

fiboSequence.setSequenceFunction(
      (i) -> 
      fiboSequence.get(i-2).add(fiboSequence.get(i-1)) 
); 

Danach haben wir die rekursive Kette fiboSequence.get(i) nennen kann und ein Ergebnis oder eine Stackoverflow, wenn die gesamte Kette incomputable war.

Bei Verwendung der Rekursion bekommt SO eine ganz andere Bedeutung: Sie sind zu tief gesprungen, wiederholen Sie die Teilung in flacheren Schritten.

1

Hier ist meine Lösung,

public class TryExample { 

    public static void main(String[] args){ 
     try { 
      int no=10/0; 
     } catch (Exception e) { 
      System.err.println("Arithmetic Exception occurs!"); 
     } 
    } 
} 
+0

Ihre Lösung für etwas, was vor einigen Jahren mit einem richtigen Weg beantwortet wurde? Du erkennst, dass das "Exception" -Fang das ist, was OP schon versucht hat und offensichtlich nicht funktioniert hat? – Tom