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.