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?
Odpowiedz
wydaje się działać:
public class Test {
public static void main(String[] argv){
try{
main(null);
}
catch(StackOverflowError e){
System.err.println("ouch!");
}
}
}
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ę.
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
Złapanie błędu SO jest również przydatne do debugowania, gdy nie wiesz, która z wielu metod rekursywnych powoduje błąd SO :) –
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.
Gdzie pytający mówi, że chce połknąć? Wręcz przeciwnie, chce "ukarać wartość" – Gangnus
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". –
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
Trzeba złapać błąd, a nie wyjątkiem
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.
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!");
}
}
}
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
- 1. Dziwne przepełnienie stosu?
- 2. Przepełnienie stosu w linii 0
- 3. Tajemniczy przepełnienie stosu w konstruktorze
- 4. pobranie śledzenia stosu przy próbie wykonania polecenia tryCatch w R
- 5. przepełnienie stosu dla rekurencyjnego liczby elementów w java
- 6. kompilator przepełnienie stosu na kodzie szablonu
- 7. Nieformalne błąd powoduje przepełnienie stosu
- 8. Wyjątek AppDomain.FirstChanceException i przepełnienie stosu
- 9. Przeciążenie operatora powoduje przepełnienie stosu
- 10. Przepełnienie stosu spowodowane funkcją rekursywną
- 11. przepełnienie stosu wyjątku w programie głupie
- 12. Przepełnienie stosu w bardzo prostym kodzie
- 13. Przepełnienie stosu podczas korzystania z metody System.Net.Sockets.Socket.AcceptAsync
- 14. Dlaczego ta pętla powoduje przepełnienie stosu?
- 15. Jak złapać przepełnienie stosu za pomocą pthread?
- 16. Jak zaimplementować wyszukiwanie, takie jak przepełnienie stosu
- 17. Automatyczne uzupełnianie tagów takich jak przepełnienie stosu
- 18. Przepełnienie bufora stosu: działa na GDB, nie jest poza nim
- 19. Dlaczego ten wyzwalacz MySQL powoduje przepełnienie stosu?
- 20. przepełnienie stosu w LINQ to SQL i zawiera słowa kluczowego
- 21. "BŁĄD - przepełnienie stosu C" w Haskell przy użyciu uścisków
- 22. Dlaczego to polecenie powoduje przepełnienie stosu w prologu?
- 23. Przepełnienie stosu w GHCI podczas próby wyświetlenia numeru
- 24. Jak zabezpieczyć metody w java (przepełnienie itd.)
- 25. Błąd przepełnienia stosu Java - jak zwiększyć rozmiar stosu w Eclipse?
- 26. Wyraźna implementacja interfejsu GetEnumerator interfejsu powoduje przepełnienie stosu
- 27. przepełnienie stosu podczas próby dostępu do formantów formularzy z klasy
- 28. Przepełnienie stosu podczas kompilowania pliku dwscript zawierającego TForm.Create (zero)
- 29. Common Lisp: Dlaczego funkcja rekurencji ogona powoduje przepełnienie stosu?
- 30. Dlaczego to proste użycie monady State powoduje przepełnienie stosu?
profilaktyka jest lepsza niż łapanie .... –
wzrok jest przydatna do debugowania :) – JonnyBoy