2010-03-29 25 views
15

Czy możesz spróbować/złapać wyjątek przepełnienia stosu w java? Wydaje się, że rzuca się w obie strony. Kiedy moje procedury się przepełniają, chciałbym "ukarać" tę wartość.try/catch na przepełnienie stosu w java?

+12

profilaktyka jest lepsza niż łapanie .... –

+4

wzrok jest przydatna do debugowania :) – JonnyBoy

Odpowiedz

22

wydaje się działać:

public class Test { 

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

} 
+1

Ah Próbowałam z rodzajowego wyjątku. Dzięki! – stereos

+0

Zgadzam się, że stwierdzenie, co jest przyczyną wyjątku i zapobieganie mu, byłoby jednak lepsze. – Thilo

+8

@stereos Nie próbowałaś złapać 'Wyjątku', prawda? 'Błąd' rozszerza' Throwable' bezpośrednio, nie poprzez 'wyjątek'. –

7

Jeśli otrzymujesz przepełnienie stosu, prawdopodobnie próbując nieskończonej rekurencji lub jest poważnie nadużywa wywołania funkcji. Być może warto rozważyć wykonanie kilku procedur iteracyjnych zamiast rekursywnych lub podwójnych sprawdzeń, czy w procedurze rekursywnej znajduje się poprawny podstawowy przypadek. Przechwytywanie wyjątku przepełnienia stosu jest złym pomysłem; leczysz objawy bez zwracania uwagi na przyczynę.

+0

W przypadku użycia rekurencji i przepełnienia ustawionych opcji JVM, SO jest normalną negatywną odpowiedzią prawidłowego programu. Musimy to złapać i zareagować. Na przykład w przypadku leniwej sekwencji, ustawionej przez rekurencyjną finalizację (http://stackoverflow.com/a/33926444/715269), możemy po prostu przejść przez mniejsze kroki. – Gangnus

+1

Złapanie błędu SO jest również przydatne do debugowania, gdy nie wiesz, która z wielu metod rekursywnych powoduje błąd SO :) –

0

Zgadzam się z Michaelem - StackOverflowException jest sygnałem, że coś poszło nie tak. Połknięcie to nie jest dobry pomysł. Najlepszym sposobem działania jest naprawienie głównej przyczyny tego błędu.

+0

Gdzie pytający mówi, że chce połknąć? Wręcz przeciwnie, chce "ukarać wartość" – Gangnus

+0

Rozumiem, że OP chce złapać wyjątek StackOverflowException, aby zaoferować niestandardową logikę (penalize) podczas przetwarzania wyjątku. I wracamy do kwadratu, który jest "Nie można złapać błędów". –

+0

I powtarzam ponownie: W przypadku użycia rekurencji SO ma zupełnie inne znaczenie: przeskoczyłeś zbyt głęboko, powtórz to dzieląc w bardziej płytkich krokach. – Gangnus

4

Trzeba złapać błąd, a nie wyjątkiem

2

Funkcjonalne cechy Javy 8 sprawia, że ​​kwestia ta nieporównanie ważniejsze. Podczas gdy zaczynamy masowo korzystać z rekurencji, wyjątek StackOverflowException jest czymś, na co MUSZĘ liczyć.

Typy lambdów w języku Java 8 nie zawiera nikogo, który zgłasza wyjątek StackOverflowException. Musimy więc stworzyć takie. Jest to absolutnie konieczne, bez tego nie przekażemy nawet kontroli IDE.

Na przykład, Integer -> Integer typ funkcja mogłaby wyglądać tak:

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

Po tym możemy napisać funkcję, która będzie akceptować lambdas rzucanie StackOverflowException.

public T get(int currentIndex) throws StackOverflowException{ 

i dopiero teraz możemy stworzyć rekurencyjne lambda:

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

Po że możemy nazwać rekurencyjnej łańcuch fiboSequence.get(i) i uzyskać wynik lub StackOverflowException jeśli cały łańcuch był nieobliczalny.

W przypadku korzystania z rekursji SO ma zupełnie inne znaczenie: przeskoczyłeś zbyt głęboko, powtórz to, dzieląc się w bardziej płytkich krokach.

1

Oto moje rozwiązanie,

public class TryExample { 

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

Twoje rozwiązanie dla czegoś, co zostało odpowiedział kilka lat temu w odpowiedni sposób? Zdajesz sobie sprawę, że łapanie 'wyjątku' jest tym, co OP już wypróbował i oczywiście nie zadziałało? – Tom

Powiązane problemy