... a kod wywołujący tę metodę musi obsługiwać lub propagować ten wyjątek (lub oba):
try{int i =5;
myObject.calculate(5);}catch(FooException ex){// Print error and terminate application.
ex.printStackTrace();System.exit(1);}catch(IOException ex){// Rethrow as FooException.thrownewFooException(ex);}
W powyższym przykładzie zauważysz, że IOExceptionjest przechwytywany i ponownie odrzucany jako FooException. Jest to powszechna technika używana do hermetyzacji wyjątków (zwykle podczas implementowania interfejsu API).
Czasami zdarzają się sytuacje, w których nie chcesz wymuszać na każdej metodzie deklarowania implementacji wyjątku w klauzuli throws. W takim przypadku możesz utworzyć niezaznaczony wyjątek. Niezaznaczony wyjątek to każdy wyjątek, który rozszerza java.lang.RuntimeException(który sam jest podklasą java.lang.Exception):
Niezaznaczone wyjątki są zwykle używane do oznaczenia błędu programisty, na przykład przekazywania nieprawidłowego argumentu do metody lub próby naruszenia granic indeksu tablicy.
java.lang.ThrowableKlasa jest korzeniem wszystkich błędów i wyjątków, które mogą zostać wyrzucone w ciągu Java. java.lang.Exceptioni java.lang.Errorobie są podklasami Throwable. Wszystko, co podklasy Throwablemoże zostać rzucone lub złapane. Jednak przechwytywanie lub wyrzucanie jest zazwyczaj złą praktyką, Errorponieważ jest to używane do oznaczania błędów wewnętrznych JVM, które zwykle nie mogą być „obsługiwane” przez programistę (np OutOfMemoryError.). Powinieneś także unikać łapania Throwable, które mogłoby spowodować, Errorże oprócz Exceptions.
Technicznie rzecz biorąc, wszystko, co rozszerza, Throwablemoże być wyrzucone, ale wyjątki są zwykle rozszerzeniami Exceptionklasy, więc są sprawdzanymi wyjątkami (z wyjątkiem RuntimeException lub klas na nim opartych, które nie są sprawdzane), w przeciwieństwie do innych powszechnych typów elementów do rzucania, Errorktóre zazwyczaj nie są zaprojektowane do wygodnej obsługi poza wewnętrznymi mechanizmami JVM.
Możesz także uczynić wyjątki niepublicznymi, ale wtedy możesz ich używać tylko w pakiecie, który je definiuje, w przeciwieństwie do wszystkich pakietów.
Jeśli chodzi o wyrzucanie / łapanie niestandardowych wyjątków, działa to tak samo, jak te wbudowane - rzut przez
RuntimeException rozszerza Exception i nie jest sprawdzanym wyjątkiem.
Adamski
2
Technicznie rzecz biorąc, wszystko, co się rozciąga, Throwablemoże zostać rzucone ; wydłużają się wyjątki Exception. Niestandardowa podklasa Throwable nie została złapana przez try { ... } catch (Exception e) { ... }blok.
Andrzej Doyle
Dlaczego ludzie głosują za tą odpowiedzią? Zawiera kilka nieścisłości. 1) Nie możesz implmenet throwable, ponieważ jest to interfejs. 2) Wszystko, co rozszerza Throwable NIE jest wyjątkiem ( Errornie jest wyjątkiem, to błąd). 3) Oznacza to, że każda podklasa Exception jest sprawdzana, podczas gdy RuntimeException nie. Odpowiedź udzielona przez Adamskiego jest znacznie dokładniejsza!
oxbow_lakes
Ups - miałem na myśli, że rzucanie nie jest oczywiście interfejsem!
oxbow_lakes
@oxbow_lakes - idealnym rozwiązaniem byłoby naprawienie niedokładności, prawda? W każdym razie sam je poprawiłem, ponieważ nikt inny tego nie zrobił.
Odpowiedzi:
Aby zdefiniować zaznaczony wyjątek, należy utworzyć podklasę (lub hierarchię podklas)
java.lang.Exception
. Na przykład:Metody, które mogą potencjalnie zgłosić lub propagować ten wyjątek, muszą go zadeklarować:
... a kod wywołujący tę metodę musi obsługiwać lub propagować ten wyjątek (lub oba):
W powyższym przykładzie zauważysz, że
IOException
jest przechwytywany i ponownie odrzucany jakoFooException
. Jest to powszechna technika używana do hermetyzacji wyjątków (zwykle podczas implementowania interfejsu API).Czasami zdarzają się sytuacje, w których nie chcesz wymuszać na każdej metodzie deklarowania implementacji wyjątku w klauzuli throws. W takim przypadku możesz utworzyć niezaznaczony wyjątek. Niezaznaczony wyjątek to każdy wyjątek, który rozszerza
java.lang.RuntimeException
(który sam jest podklasąjava.lang.Exception
):Metody mogą zgłaszać lub propagować
FooRuntimeException
wyjątek bez jego deklarowania; na przykładNiezaznaczone wyjątki są zwykle używane do oznaczenia błędu programisty, na przykład przekazywania nieprawidłowego argumentu do metody lub próby naruszenia granic indeksu tablicy.
java.lang.Throwable
Klasa jest korzeniem wszystkich błędów i wyjątków, które mogą zostać wyrzucone w ciągu Java.java.lang.Exception
ijava.lang.Error
obie są podklasamiThrowable
. Wszystko, co podklasyThrowable
może zostać rzucone lub złapane. Jednak przechwytywanie lub wyrzucanie jest zazwyczaj złą praktyką,Error
ponieważ jest to używane do oznaczania błędów wewnętrznych JVM, które zwykle nie mogą być „obsługiwane” przez programistę (npOutOfMemoryError
.). Powinieneś także unikać łapaniaThrowable
, które mogłoby spowodować,Error
że opróczException
s.źródło
Rzuć to jako:
Złap jako:
źródło
W przypadku zaznaczonego wyjątku:
Technicznie rzecz biorąc, wszystko, co rozszerza,
Throwable
może być wyrzucone, ale wyjątki są zwykle rozszerzeniamiException
klasy, więc są sprawdzanymi wyjątkami (z wyjątkiem RuntimeException lub klas na nim opartych, które nie są sprawdzane), w przeciwieństwie do innych powszechnych typów elementów do rzucania,Error
które zazwyczaj nie są zaprojektowane do wygodnej obsługi poza wewnętrznymi mechanizmami JVM.Możesz także uczynić wyjątki niepublicznymi, ale wtedy możesz ich używać tylko w pakiecie, który je definiuje, w przeciwieństwie do wszystkich pakietów.
Jeśli chodzi o wyrzucanie / łapanie niestandardowych wyjątków, działa to tak samo, jak te wbudowane - rzut przez
i złap przez
źródło
Throwable
może zostać rzucone ; wydłużają się wyjątkiException
. Niestandardowa podklasa Throwable nie została złapana przeztry { ... } catch (Exception e) { ... }
blok.Error
nie jest wyjątkiem, to błąd). 3) Oznacza to, że każda podklasa Exception jest sprawdzana, podczas gdy RuntimeException nie. Odpowiedź udzielona przez Adamskiego jest znacznie dokładniejsza!