class throwseg1
{
void show() throws Exception
{
throw new Exception("my.own.Exception");
}
void show2() throws Exception // Why throws is necessary here ?
{
show();
}
void show3() throws Exception // Why throws is necessary here ?
{
show2();
}
public static void main(String s[]) throws Exception // Why throws is necessary here ?
{
throwseg1 o1 = new throwseg1();
o1.show3();
}
}
Dlaczego kompilator doniesienia, że metody show2()
, show3()
i main()
mieć
niezgłoszony wyjątek Wyjątek, który należy przechwycić lub zadeklarować jako zgłoszony
kiedy usuwam throws Exception
z tych metod?
Exception
, musimy zdefiniować metodę wywołującą ( Method2 ) zthrows Exception
; jeśli nie przekazujemy tego wyjątku w metodzie wywołującej. Celem jest to, aby dać głowice do metody wywołującej ( Method3 ) od Method2 że wyjątek może być rzucony przez Method2 i należy go obsługiwać tu jeszcze może przerwać program.throws Exception
w swojej definicji metody, aby przekazać informacje o swojej metodzie wywołującej. rozszerzenie poprzedniego komentarzaOdpowiedzi:
W Javie, jak być może wiesz, wyjątki można podzielić na dwie kategorie: jeden, który wymaga
throws
klauzuli lub musi być obsługiwany, jeśli nie określisz jednego, i drugi, który tego nie robi. Teraz spójrz na poniższy rysunek:W Javie możesz wrzucić wszystko, co rozszerza
Throwable
klasę. Nie musisz jednak określaćthrows
klauzuli dla wszystkich klas. Konkretnie, klas, które są alboError
lubRuntimeException
czy którykolwiek z tych dwóch podklas. W twoim przypadkuException
nie jest podklasą klasyError
lubRuntimeException
. Jest to więc sprawdzony wyjątek i musi być określony wthrows
klauzuli, jeśli nie obsługujesz tego konkretnego wyjątku. Dlatego potrzebowałeśthrows
klauzuli.Z samouczka Java :
Teraz, jak wiesz, wyjątki są podzielone na dwie: zaznaczone i niezaznaczone. Dlaczego ta klasyfikacja?
Zaznaczony wyjątek: służą do reprezentowania problemów, które można naprawić podczas wykonywania programu. Zwykle nie są one winą programisty. Na przykład plik określony przez użytkownika nie jest czytelny lub nie ma połączenia sieciowego itp. We wszystkich tych przypadkach nasz program nie musi się kończyć, zamiast tego może wykonać działania, takie jak zaalarmowanie użytkownika lub przejście do trybu awaryjnego mechanizm (jak praca w trybie offline, gdy sieć jest niedostępna) itp.
Niezaznaczone wyjątki: Ponownie można je podzielić na dwa: błędy i wyjątki czasu wykonywania. Jednym z powodów, dla których nie można ich zaznaczyć, jest to, że są liczne i wymagane do obsługi ich wszystkich zaśmiecą nasz program i zmniejszy jego przejrzystość. Innym powodem jest:
Wyjątki w czasie wykonywania: Zwykle zdarzają się z powodu błędu programisty. Na przykład, jeśli występuje
ArithmeticException
dzielenie przez zero lubArrayIndexOutOfBoundsException
występuje, dzieje się tak, ponieważ nie jesteśmy wystarczająco ostrożni w naszym kodowaniu. Zdarzają się zwykle z powodu błędów w logice naszego programu. Dlatego muszą zostać wyczyszczone, zanim nasz program wejdzie w tryb produkcyjny. Są odznaczone w tym sensie, że nasz program musi zawieść, gdy się pojawi, abyśmy programiści mogli go rozwiązać w czasie tworzenia i testowania.Błędy: Błędy to sytuacje, których zwykle program nie może naprawić. Na przykład, jeśli
StackOverflowError
wystąpi a , nasz program nie może wiele zrobić, na przykład zwiększyć rozmiar stosu wywołań funkcji programu. Lub jeśliOutOfMemoryError
wystąpi, nie możemy zrobić wiele, aby zwiększyć ilość pamięci RAM dostępnej dla naszego programu. W takich przypadkach lepiej wyjść z programu. Dlatego nie są zaznaczone.Aby uzyskać szczegółowe informacje, patrz:
źródło
Java wymaga obsługi lub deklarowania wszystkich wyjątków. Jeśli nie obsługujesz wyjątku przy użyciu bloku try / catch, należy go zadeklarować w podpisie metody.
Na przykład:
Powinien być zapisany jako:
W ten sposób możesz pozbyć się deklaracji „rzuca wyjątek” w deklaracji metody.
źródło
RuntimeException
znaczy wszystkie wyjątki, które nie są podklasami programu .Throwable
(dziedziczenieException
też działa, ponieważ rozszerzaThrowable
, ale nie jest wymagane).throws Exception
Deklaracja jest zautomatyzowany sposób śledzenie metod, które mogłyby rzucić wyjątek dla przewidywanych ale nieuniknionych powodów. Deklaracja jest zwykle specyficzna dla typu lub typów wyjątków, które mogą być generowane, takich jakthrows IOException
lubthrows IOException, MyException
.Wszyscy mamy lub w końcu napiszemy kod, który nieoczekiwanie zatrzymuje się i zgłasza wyjątek z powodu czegoś, czego nie przewidzieliśmy przed uruchomieniem programu, na przykład dzielenie przez zero lub indeksowanie poza zakresem. Ponieważ metoda nie spodziewała się błędów, nie można ich było „wychwycić” i obsłużyć za pomocą klauzuli try catch. Niczego nie podejrzewający użytkownicy metody również nie wiedzieliby o takiej możliwości, a ich programy również by się zatrzymały.
Gdy programista wie, że mogą wystąpić pewne typy błędów, ale chciałby obsłużyć te wyjątki poza metodą, metoda może „zgłosić” jeden lub więcej typów wyjątków do metody wywołującej zamiast ich obsługi. Gdyby programista nie zadeklarował, że metoda (mogłaby) rzucić wyjątek (lub gdyby Java nie miała możliwości zadeklarowania go), kompilator nie mógł tego wiedzieć i przyszły użytkownik metody miałby wiedzieć o tym, złapać i obsłużyć wszelkie wyjątki, które metoda może zgłosić. Ponieważ programy mogą mieć wiele warstw metod napisanych przez wiele różnych programów, śledzenie, które metody mogą generować wyjątki, staje się trudne (niemożliwe).
Mimo że Java ma możliwość deklarowania wyjątków, nadal możesz napisać nową metodę z nieobsługiwanymi i niezadeklarowanymi wyjątkami, a Java ją skompiluje i możesz ją uruchomić i mieć nadzieję na najlepsze. To, czego Java nie pozwoli ci zrobić, to skompilowanie nowej metody, jeśli używa metody, która została zadeklarowana jako wyjątek (y) wyrzucania, chyba że obsłużysz zadeklarowane wyjątki w swojej metodzie lub zadeklarujesz swoją metodę jako rzucającą to samo wyjątek (y) lub jeśli istnieje wiele wyjątków, możesz obsłużyć niektóre i wyrzucić resztę.
Gdy programista deklaruje, że metoda rzuca określony typ wyjątku, jest to po prostu zautomatyzowany sposób ostrzeżenia innych programistów za pomocą metody, że wyjątek jest możliwy. Programista może następnie zdecydować o obsłużeniu wyjątku lub przekazaniu ostrzeżenia, deklarując metodę wywołującą, która również zgłasza ten sam wyjątek. Ponieważ kompilator został ostrzeżony, że wyjątek jest możliwy w tej nowej metodzie, może automatycznie sprawdzić, czy przyszłe obiekty wywołujące nową metodę obsługują wyjątek lub deklarują go i wymuszają wystąpienie jednego lub drugiego.
Zaletą tego typu rozwiązania jest to, że gdy kompilator zgłasza
Error: Unhandled exception type java.io.IOException
, podaje plik i numer wiersza metody, która została zadeklarowana do zgłaszania wyjątku. Następnie możesz zdecydować się po prostu przekroczyć cenę i zadeklarować, że twoja metoda również „rzuca IOException”. Można to zrobić aż do metody głównej, w której spowodowałoby to zatrzymanie programu i zgłoszenie wyjątku użytkownikowi. Jednak lepiej jest wyłapać wyjątek i poradzić sobie z nim w przyjemny sposób, na przykład wyjaśnić użytkownikowi, co się stało i jak to naprawić. Gdy metoda przechwytuje i obsługuje wyjątek, nie musi już deklarować wyjątku. Na tym kończą się, że tak powiem.źródło
Exception
jest sprawdzoną klasą wyjątków. Dlatego każdy kod, który wywołuje metodę, która deklaruje, żethrows Exception
musi ją obsłużyć lub zadeklarować.źródło
Tylko małe zmiany w twoim programie. To, co wydaje się być niezrozumiałe przez wielu w odniesieniu do głównego problemu, to to, że za każdym razem, gdy rzucasz wyjątek, musisz go obsłużyć, nie jest to konieczne w tym samym miejscu (np. Metoda show1,2,3 w twoim programie), ale najpierw musisz wywołać metodę wewnątrz „głównego”. jednym słowem jest „rzut”, musi być „złap / spróbuj”, nawet jeśli nie jest to ta sama metoda, w której występuje wyjątek.
źródło
Ponieważ w metodzie show () jest zaznaczony wyjątek, który nie jest obsługiwany w tej metodzie, do propagowania wyjątku używamy słowa kluczowego throws.
Ponieważ używasz metody show () w metodzie show2 () i propagujesz przynajmniej wyjątek, który powinieneś tutaj obsługiwać. Jeśli nie obsługujesz tutaj wyjątku, używasz słowa kluczowego throws. To jest powód użycia słowa kluczowego throws w sygnaturze metody.
źródło
Jeśli propagujesz wyjątek przez zadeklarowanie dyrektywy throws w sygnaturze bieżącej metody, to gdzieś w górę wiersza lub stosu wywołań musi zostać użyta konstrukcja try / catch do obsługi wyjątku.
źródło
Zasadniczo, jeśli nie obsługujesz wyjątku w tym samym miejscu, w którym go wyrzucasz, możesz użyć opcji „rzuca wyjątek” w definicji funkcji.
źródło