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?
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?
Odpowiedzi:
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
...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.
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.
Błędy -
Error
s w java są typu java.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ą typu java.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
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
dalsze czytanie: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
Sun ujął to najlepiej :
Błąd to podklasa Throwable, która wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić.
Opis Error
zajęć jest dość jasny:
Jest
Error
podklasą tego,Throwable
co wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić. Większość takich błędów to nieprawidłowe warunki.ThreadDeath
Błąd, choć „normalnym” stanie, jest również podklasaError
ponieważ większość aplikacji nie należy próbować go złapać.Metoda nie musi deklarować w swojej klauzuli throws żadnych podklas,
Error
które mogą zostać wyrzucone podczas wykonywania metody, ale nie zostaną przechwycone, ponieważ te błędy są nienormalnymi warunkami, które nigdy nie powinny wystąpić.
Cytowane z dokumentacji klasyError
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.
Istnieje kilka podobieństw i różnic między klasami java.lang.Exception
i java.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 dla java.lang.Exception
i podklasy, o java.lang.Throwable
, java.lang.Error
a java.lang.RuntimeException
, a ich podklasy jest opcjonalne.
Tylko java.lang.Throwable
i podklasy mogą być używane w catch
klauzuli.
java.lang.Throwable
Ze słowem kluczowym - można używać tylko i podklas throw
.
Wniosek z tej właściwości wynika z obu java.lang.Error
i java.lang.Exception
może być zadeklarowany w nagłówku metody, może być w catch
klauzuli, może być używany ze słowem kluczowym throw
.
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 innego java.lang.Throwable
następcy).
Fragment z opisu javadoc o java.lang.Error
:
... wskazuje na poważne problemy, których rozsądna aplikacja nie powinna próbować wychwycić.
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
:
... wskazuje warunki, które rozsądna aplikacja może chcieć złapać.
java.lang.Error
i java.lang.Exception
ta pierwsza uważana jest za niezaznaczony wyjątek do sprawdzania wyjątków w czasie kompilacji. Ponieważ wynikowy kod java.lang.Error
lub jego podklasy nie wymagają deklarowania tego błędu w nagłówku metody. Podczas rzucania java.lang.Exception
wymaganej deklaracji w nagłówku metody.Diagram klas miotania i jego następcy (właściwości i metody są pomijane).
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.
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.
Oto całkiem dobre podsumowanie interfejsu API języka Java, co oznacza błąd i wyjątek:
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. Błąd ThreadDeath, chociaż jest stanem „normalnym”, jest również podklasą błędu, ponieważ większość aplikacji nie powinna próbować go wychwycić.
Metoda nie musi deklarować w swojej klauzuli throws żadnych podklas Error, które mogą zostać wyrzucone podczas wykonywania metody, ale nie zostaną przechwycone, ponieważ te błędy są nienormalnymi warunkami, które nigdy nie powinny wystąpić.
OTOH, for Exceptions, Java API mówi:
Klasa Exception i jej podklasy są formą Throwable, która wskazuje warunki, które rozsądna aplikacja może chcieć złapać.
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 lub
StackOverflowError
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.
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/… .