2012-10-27 15 views
7

Dlaczego dwa typy wyjątków w Javie są "zaznaczone" i "niezaznaczone"? Jaki jest powód tych nazw?Dlaczego wyjątki są zaznaczone i odznaczone?

+1

Co jeszcze nazwałbyś je? Jakie jest pytanie? Tak długo, jak rozumiesz, co oznacza "sprawdzone", oznacza to, że nie jest to prawdziwe pytanie. – EJP

Odpowiedz

12

Jeśli wywołać metodę, która jest zadeklarowana rzucić sprawdzone wyjątku (takie jak IOException), kompilator check że jesteś albo zarażenia lub stwierdzenie, że to rethrow. Podobnie, w celu wyrzucenia takiego sprawdzonego wyjątku, kompilator sprawdza, czy zadeklarowałeś go jako część podpisu metody.

Zasadniczo jest to trochę podobne do sprawdzania typu, z wyjątkiem tego, które wyjątki mogą być rzucane przez metodę.

Kompilator nie sprawdza pod kątem odznaczeń niezaznaczonych - można je więc wyrzucać dowolną metodą bez deklarowania ich.

+0

+1 szybkie i dokładne, jak zawsze. – dan

+0

Dokładnie, dziękuję :) – LuckyLuke

3

Sprawdzane wyjątki są sprawdzane przez kompilator Java: sprawdza, czy je złapałeś lub zadeklarował w podpisie metody.

2

"Sprawdzone" oznacza, że ​​musisz go złapać lub zadeklarować, że twoja metoda zgłasza go w podpisie. Użytkownicy Twojej metody muszą złapać sprawdzone wyjątki. Niespełnienie tego spowoduje błąd kompilatora.

"Niezaznaczone" oznacza, że ​​ani ty, ani użytkownicy Twojej metody nie są zobowiązani do wychwycenia wyjątku. Nie musisz zadeklarować go w klauzuli throws w metodzie podpisu.

W najwcześniejszej inkarnacji Java wybrała pierwszą częściej niż nie.

C# powoduje, że niezaznaczone wyjątki są domyślne. Programiści Java już teraz przyjęli tę konwencję.

-1
  • sprawdzone wyjątki - te wyjątki są tworzone przez użytkowników lub coś, co można określić jako IOException. Oto wyjątki business-logic. Wszystkie te muszą być zadeklarowane jako "throws xxxException" lub otoczone try-catch. Dlatego nazwa - MUSISZ sprawdzić je wyraźnie.

  • niesprawdzonych wyjątki - tu są wyjątki, które są głównie wewnętrzne Java Virtual Machine jak RuntimeException, StackOverFlowException i błędów. Nie powinny one być przetwarzane przez aplikację i mogą stać się nieistotne dla logiki biznesowej aplikacji. Oni nie muszą być zadeklarowane z „rzuca” lub otoczone try-catch

+0

To jest nieprawidłowe. Użytkownicy mogą tworzyć niezaznaczone wyjątki, rozszerzając wyjątek RuntimeException. IllegalArgumentException * jest * niezaznaczonym wyjątkiem; Wyjątek SQLException to sprawdzony wyjątek. Proszę to poprawić. – duffymo

+0

Masz rację, mój przykład był błędny, ale pomysł, który wyjaśniam, jest inny. Informacje o wyjątkach od logiki biznesowej, które mogą być podobne do wyjątku PaymentException, TranscationFailedException, itp. - przynoszą pewne znaczenie dla aplikacji biznesowej ... Deweloper może rozszerzyć wyjątek RuntimeException, ale to nie znaczy, że powinieneś to zrobić. Osobiście uważam, że to powinno zdarzać się rzadko, a ja uważam to za anty-wzór. Powinieneś być w stanie omówić wszystkie wyjątki z jasnym, łatwym do zrozumienia i niewielką liczbą wyjątków i nie ukrywać niektórych z nich dla użytkownika twojej klasy. –

+0

Nie uważasz, że powinni to zrobić? Jaka jest twoja odpowiedź na fakt, że C# czyni niezaznaczone wyjątki domyślnym i powszechnym idiomem? I że Jawa pasuje teraz? Sugerujesz, że Anders Hejlsberg jest kiepskim projektantem języków? – duffymo

1

W Javie można rzucać żadnych Throwable. Throwble ma dwie podklasy: Error i Exception. Po wyrzuceniu Error wystąpił poważny problem, który często ma niewiele wspólnego z kodem. Takie wyjątki nie są sprawdzane przez kompilator i są przykładem niezerowego wyjątku .

Wyjątek ma podklasa o nazwie RuntimeException, są to często wyjątki wskazujące na błędy w kodzie i często mogą występować w wielu miejscach w większości kodu. Przykładami są: NullPointerException, ArrayIndexOutOfBoundsException itp. Są one również niezaznaczone, ponieważ można zaśmiecać kod przy pomocy tych wartości.

wszystkich innych wyjątków są sprawdzane ponieważ przez kompilator i trzeba złapać lub rzucać je.

Powiązane problemy