Próbuję dowiedzieć się więcej o podstawowej Javie i różnych typach Throwables. Czy ktoś może mi powiedzieć o różnicach między wyjątkami i błędami?
173
Błędów nie należy wychwytywać ani naprawiać (z wyjątkiem najrzadszych przypadków). Wyjątkami są chleb powszedni obsługi wyjątków. Javadoc wyjaśnia to dobrze:
Błąd to podklasa Throwable, która wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić. Większość takich błędów to nienormalne warunki.
Przyjrzyj się kilku podklasom programu Error
, biorąc niektóre z ich komentarzy JavaDoc:
AnnotationFormatError
- Zgłaszane, gdy parser adnotacji próbuje odczytać adnotację z pliku klasy i stwierdza, że adnotacja jest źle sformułowana.AssertionError
- Zgłoszony, aby wskazać, że asercja nie powiodła się.LinkageError
- Podklasy LinkageError wskazują, że klasa jest zależna od innej klasy; jednak druga klasa zmieniła się niekompatybilnie po kompilacji poprzedniej klasy.VirtualMachineError
- Zgłoszony, aby wskazać, że wirtualna maszyna języka Java jest uszkodzona lub zabrakło zasobów niezbędnych do jej dalszego działania. Istnieją naprawdę trzy ważne podkategorie Throwable
:
Error
- Coś wystarczająco poważnego poszło nie tak i większość aplikacji powinna ulec awarii, zamiast próbować rozwiązać problem,RuntimeException
) - Bardzo często błąd programowania, taki jak NullPointerException
lub niedozwolony argument. Aplikacje mogą czasami obsługiwać tę Throwable
kategorię lub odzyskiwać ją z tej kategorii - lub przynajmniej przechwytywać ją w run()
metodzie Thread , rejestrować skargę i kontynuować działanie.FileNotFoundException
i TimeoutException
...
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
. Wiem, że rodzi pytanie: czy błąd jest wyjątkiem? , ale tak piszą. Oto tylko jeden z tych przykładów: docs.oracle.com/javase/tutorial/essential/exceptions/… .Ten slajd przedstawiający hierarchię wyjątków Javy autorstwa @ georgios-gousios zwięźle wyjaśnia różnice między błędami a wyjątkami w Javie.
źródło
Błędy zwykle sygnalizują koniec aplikacji, jaką znasz. Zwykle nie można go odzyskać i powinien spowodować zamknięcie maszyny wirtualnej. Nie powinno się ich łapać poza ewentualnym logowaniem lub wyświetlaniem i odpowiednim komunikatem przed wyjściem.
Przykład: OutOfMemoryError - Niewiele możesz zrobić, ponieważ Twój program nie może już działać.
Wyjątki są często możliwe do odzyskania, a nawet jeśli tak się nie stanie, zazwyczaj oznaczają po prostu, że próba operacji nie powiodła się, ale program może nadal działać.
Przykład: IllegalArgumentException - przekazano nieprawidłowe dane do metody, więc wywołanie metody nie powiodło się, ale nie ma to wpływu na przyszłe operacje.
To są uproszczone przykłady, a inne bogactwo informacji dotyczy samych tylko wyjątków.
źródło
Błędy -
Error
s w java są typujava.lang.Error
.Error
dzieje się w czasie wykonywania. Nie będą znane kompilatorowi.Error
s są najczęściej spowodowane przez środowisko, w którym działa aplikacja.java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Wyjątki -
Exception
s w java są typujava.lang.Exception
.Exception
s obejmują zarówno zaznaczony, jak i niezaznaczony typ.try-catch
bloków.Exception
s są głównie spowodowane przez samą aplikację.SQLException
,IOException
niezaznaczone Wyjątki:
ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
dalsze czytanie: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
źródło
Sun ujął to najlepiej :
źródło
Opis
Error
zajęć jest dość jasny:Cytowane z dokumentacji klasy
Error
Javy .Krótko mówiąc, nie powinieneś łapać
Error
s, chyba że masz ku temu dobry powód. (Na przykład, aby zapobiec awariom implementacji serwera WWW, jeśli serwletowi zabraknie pamięci lub coś w tym rodzaju).Z
Exception
drugiej strony, an jest zwykłym wyjątkiem, jak w każdym innym nowoczesnym języku. Szczegółowy opis można znaleźć w dokumentacji Java API lub w dowolnym zasobie online lub offline.źródło
Istnieje kilka podobieństw i różnic między klasami
java.lang.Exception
ijava.lang.Error
.Podobieństwa:
Po pierwsze - obie klasy rozciąga się
java.lang.Throwable
i na skutek dziedziczy wiele metod, które są powszechne stosowane przy obsłudze błędów, takich jak:getMessage
,getStackTrace
,printStackTrace
i tak dalej.Po drugie, jako podklasy
java.lang.Throwable
obu dziedziczą następujące właściwości:Sam Throwable i dowolne z jego podklas (w tym
java.lang.Error
) można zadeklarować na liście wyjątków metod za pomocąthrows
słowa kluczowego. Taka deklaracja wymagane tylko dlajava.lang.Exception
i podklasy, ojava.lang.Throwable
,java.lang.Error
ajava.lang.RuntimeException
, a ich podklasy jest opcjonalne.Tylko
java.lang.Throwable
i podklasy mogą być używane wcatch
klauzuli.java.lang.Throwable
Ze słowem kluczowym - można używać tylko i podklasthrow
.Wniosek z tej właściwości wynika z obu
java.lang.Error
ijava.lang.Exception
może być zadeklarowany w nagłówku metody, może być wcatch
klauzuli, może być używany ze słowem kluczowymthrow
.Różnice:
Po pierwsze - różnica pojęciowa:
java.lang.Error
zaprojektowana do wyrzucenia przez JVM i wskazania poważnych problemów oraz do zatrzymania wykonywania programu zamiast bycia złapanym (ale jest to możliwe jak w przypadku każdego innegojava.lang.Throwable
następcy).Fragment z opisu javadoc o
java.lang.Error
:Z drugiej strony
java.lang.Exception
zaprojektowany do reprezentowania błędów, które są oczekiwane i mogą być obsługiwane przez programistę bez przerywania wykonywania programu.Fragment z opisu javadoc o
java.lang.Exception
:java.lang.Error
ijava.lang.Exception
ta pierwsza uważana jest za niezaznaczony wyjątek do sprawdzania wyjątków w czasie kompilacji. Ponieważ wynikowy kodjava.lang.Error
lub jego podklasy nie wymagają deklarowania tego błędu w nagłówku metody. Podczas rzucaniajava.lang.Exception
wymaganej deklaracji w nagłówku metody.Diagram klas miotania i jego następcy (właściwości i metody są pomijane).
źródło
IMO błąd to coś, co może spowodować awarię aplikacji i nie należy go obsługiwać. Wyjątkiem jest coś, co może powodować nieprzewidywalne wyniki, ale można je odzyskać.
Przykład:
Jeśli programowi zabrakło pamięci, jest to błąd, ponieważ aplikacja nie może kontynuować. Jednakże, jeśli program akceptuje nieprawidłowy typ danych wejściowych, jest to wyjątek, ponieważ program może go obsłużyć i przekierować, aby otrzymać poprawny typ danych wejściowych.
źródło
Błędy są głównie powodowane przez środowisko, w którym działa aplikacja. Na przykład OutOfMemoryError występuje, gdy JVM zabraknie pamięci lub StackOverflowError występuje, gdy stos się przepełnia.
Wyjątki są powodowane głównie przez samą aplikację. Na przykład NullPointerException występuje, gdy aplikacja próbuje uzyskać dostęp do obiektu o wartości null lub ClassCastException występuje, gdy aplikacja próbuje rzutować niezgodne typy klas.
Źródło: różnica między błędem a wyjątkiem w Javie
źródło
Oto całkiem dobre podsumowanie interfejsu API języka Java, co oznacza błąd i wyjątek:
OTOH, for Exceptions, Java API mówi:
źródło
Błędy są powodowane przez środowisko, w którym działa aplikacja lub program. W większości przypadków nie można odzyskać danych, ponieważ kończy to działanie aplikacji lub programu. Javadoc radzi, aby nie przejmować się wyłapywaniem takich błędów, ponieważ środowisko np. JVM, na takie błędy i tak będzie zamknięte.
Przykłady:
VirtualMachineError
- Zgłoszony, aby wskazać, że wirtualna maszyna języka Java jest uszkodzona lub zabrakło zasobów niezbędnych do jej dalszego działania.OutOfMemoryError
występuje, gdy JVM zabraknie pamięci lubStackOverflowError
gdy stos się skończy.Wyjątki są powodowane przez samą aplikację lub program; może z powodu twojego własnego błędu. W większości przypadków można go odzyskać, a aplikacja nadal będzie działać. Zaleca się wychwycenie takich błędów, aby zapobiec nieprawidłowemu zakończeniu działania aplikacji lub programu i / lub móc dostosować komunikat wyjątku, aby użytkownicy widzieli ładnie sformatowany komunikat zamiast domyślnych brzydkich komunikatów o wyjątkach rozrzuconych po całym miejscu.
Przykłady:
NullPointerException
występuje, gdy aplikacja próbuje uzyskać dostęp do obiektu zerowego. lub Próba uzyskania dostępu do tablicy z nieistniejącym indeksem lub wywołanie funkcji z nieprawidłowymi danymi lub parametrami.źródło