Zgłaszanie wyjątków - instrukcja throws
Mechanizm zgłaszania wyjątków (ang. throwing an exception) jest używany:
- w przypadku wyjątków, których nie da się obsłużyć,
- w przypadku wyjątków, których obsługa nie ma sensu,
- gdy wystąpienie wyjątku może spowodować nieprawidłową pracę w dalszych etapach programu.
Ogólny schemat:
[access_modifier][static][final] nazwa_metody() throws typ_wyjątku1, typ_wyjątku2, ... {
kod...
throw new typ_wyjatku1();
kod
...
Typ wyjątku to klasa. Wyjątek, to obiekt danej klasy, który tworzymy przy użyciu instrukcji new.
Aby zgłosić wyjątek, użyj instrukcji throw, a po spacji podaj referencję do obiektu wyjątku.
Możesz zrobić to także w ten sposób:
YourException exception1 = new YourException();
throw exception1;
W nagłówku metody musi występować deklaracja typów wyjątków, które dana metoda może zgłaszać. Użyj do tego instrukcji throws i po spacji podaj listę oddzielonych przecinkami nazw typów wyjątków. W kodzie tej metody będzie można zgłosić te typy wyjątków.
Zgłaszać w ten sposób można wszystkie rodzaje wyjątków, czyli obiekty klas, które pośrednio, lub bezpośrednio dziedziczą z klasy Throwable. Hierarchię dziedziczenia klas wyjątków widać poniżej:
Figure: Hierarchia klasy Throwable oraz Exception
Na powyższym schemacie widoczne są:
- CZERWONE - wyjątki nie wymagające obsługi (ang. uncaught),
- NIEBIESKIE - wyjątki , które musimy zgłosić, lub obsłużyć zgodnie z wyżej dostępnym opisem.
Błędy typu Error - np. OutOfMemoryException - zazwyczaj nie są generowane przez sam program, a raczej przez maszynę wirtualną, lub środowisko. Nie ma potrzeby zgłaszania, lub obsługi takich wyjątków.
Przykład - program dzielący liczbę 10, przez wartość podaną przez użytkownika.
import java.util.*;
class MyDivisionByZeroException extends ArithmeticException {
public MyDivisionByZeroException( String str ) {
super();
System.out.println( str );
}
}
public class Main {
public static void main( String[] agrs ) throws MyDivisionByZeroException {
int y;
Scanner sc = new Scanner( System.in );
System.out.print( "Podaj dzielnik: " );
y = sc.nextInt();
if( y==0 )
throw new MyDivisionByZeroException( "Niedozwolone dzielenie przez 0" );
else
System.out.println( 4/(double)y );
}
}
Jak widać wyjątek może zgłaszać każda metoda, także main(). Najpierw deklarujemy, że może ona zgłosić wyjątek typu ArithmeticException, robimy to, gdy użytkownik wprowadzi wartość 0, bo jak wiadomo, dzielenie przez 0 nie istnieje. Jeżeli podamy prawidłową wartość (całkowitoliczbową) to wyświetli się na ekranie prawidłowy wynik.