J. Ułasiewicz Wyjątki w Javie 1

Wyjątki w języku JAVA

Wyjątek – każde zdarzenie które może spowodować awarię programu.

Wyjątki były implementowane w językach PL/1, Smalltalk, Modula-3, Ada, Eifel, C++, Python. Rozwiązanie zastosowane w Javie wzorowane jest na języku C++.

Celem zastosowanie mechanizmu wyjątków jest zwiększenie bezpieczeństwa oprogramowania poprzez zaprojektowanie reagowania na błędy.

1 Obsługa błędów w aplikacjach Posix’owych napisanych w języku C

Obsługa błędów w aplikacjach Posix’owych napisanych w języku C zapewniana jest przez:

1. Testowanie kodu powrotu funkcji, i zmiennej errno (kod błędu ostatniej funkcji systemowej).

2. Obsługa sygnałów.

#include <errno.h>

int

res;

...

res = read(fd,buf,size);

if(res < 0) { // błąd

switch(errno) {

case 4 : // Przerwanie przez sygnał -------------------

Blok obsługi błędu 4

break;

case 5 : // Błąd we/wy -------------

Blok obsługi błędu 5

break;

case 9 : // Zły deskryptor pliku –

Blok obsługi błędu 9

break;

default :// Inne błędy --------------

Blok obsługi pozostałych błędów

break;

}

}

Program 1 Obsługa błędów poprzez testowanie kodów powrotu funkcji (Posix) Instytut Cybernetyki Technicznej Politechniki Wrocławskiej

J. Ułasiewicz Wyjątki w Javie 2

2 Hierarchia

wyjątków

W Javie wyjątki są obiektami – instancje klasy Throwable (java.lang.Object) . Gdy wystąpi wyjątek to tworzony jest obiekt klasy Throwable.

Wyjątek może być generowany przez:

1. System operacyjny

2. Używane w aplikacji klasy

Obiekt odpowiadający wyjątkowi zawiera:

1. Kontekst programu w momencie wystąpienia wyjątku (stos wywołań klas/metod)

2. Komunikat o błędzie.

3. Informację o przyczynie.

4. Wskaźnik na wyjątek klasy podrzędnej ( ang. chained exception).

Wyjątki zorganizowane są hierarchicznie są podklasami klasy Throwable. Wyjątki nadrzędne odpowiadają błędom ogólnym, podrzędne bardziej szczegółowym.

Throwable

Error

Exception

IOException

RunTimeException

InterruptedException

EOFException

InterruptedIOException

Rys. 1 Hierarchia wyjątków w Javie

Podstawowe klasy wyjątków:

1. Error - błędy wewnętrzne środowiska wykonawczego Javy (maszyny witualnej Javy).

2. RunTimeError – błędy czasu wykonania (ArrayIndexOutofBounds, NullPointerException, SecurityException,...)

3. IOException – błędy związane z systemem wejścia/wyjścia (EOFException, SocketException, InterruptedIOException).

Instytut Cybernetyki Technicznej Politechniki Wrocławskiej

J. Ułasiewicz Wyjątki w Javie 3

3 Obsługa wyjątków – klauzula catch

3.1 Prosta instrukcja try – catch

Język Java wymusza konstrukcje programowe do obsługi wyjątków. Kompilator sprawdza istnienie takich instrukcji podobnie jak typy i liczbę parametrów w procedurach.

try { // Blok gdzie może wystąpić wyjątek

...

} catch (NazwaKlasyWyjątku

e) {

// Obsługa wyjatku

...

}

Podstawowa konstrukcja obsługi wyjątku

Zmienna e odpowiada obiektowi reprezentującemu zaistniały wyjątek. Dzięki takiej konstrukcji można się odwołać do metod klasy (np. getMessage, printStackTrace).

GetMessage – Wyprowadzenie komunikatu o błędzie

public String getMessage()

...

try {

Thread.Sleep(1000);

} catch (InterruptedException e) {

// Obsługa wyjatku

System.out.printl(”Błąd: ” + e.getMessage());

}

...

Program 2 Przykład obsługi wyjątku

3.2 Wielokrotne instrukcje catch

Można testować wystąpienie wielu klas wyjątków stosując wielokrotną instrukcję catch.

try {

...

} catch (NazwaWyjątku1

e1) {

// Obsługa wyjatku 1

...

} catch (NazwaWyjątku2

e2) {

// Obsługa wyjatku 2

...

}

...

catch (NazwaWyjątkuN

eN) {

// Obsługa wyjatku N

...

}

Instytut Cybernetyki Technicznej Politechniki Wrocławskiej

J. Ułasiewicz Wyjątki w Javie 4

Testowanie wystąpienia wielu wyjątków

- W wielokrotnej instrukcji catch warunki testowane są po kolei.

- Wykonywany jest blok odpowiadający pierwszemu znalezionemu wyjątkowi –

dalsze sprawdzanie jest pomijane.

- Wyjątki zorganizowane są w sposób hierarchiczny stąd w miejscu wystąpienia klasy bazowej można użyć klasy podrzędnej.

Obsługując wyjątki z jednej hierarchii należy najpierw testować wystąpienie wyjątków podrzędnych.

...

try {

Thread.Sleep(1000);

} catch (EOFException e1) {

} catch (FileNotFoundException e2) {

} catch (IOException e3) {

}

...

Program 3 Przykład prawidłowej obsługi hierarchii wyjątków

Gdyby IOException obsługiwać najpierw nigdy nie doszło by do obsługi wyjątków klas podrzędnych.

3.3 Klauzula finally

W przypadku gdy istnieje blok instrukcji który ma być wykonany niezależnie od tego czy wystąpi wyjątek czy też nie należy użyć klauzuli finally.

try {

...

} catch (NazwaKlasyWyjątku

e) {

// Obsługa wyjatku

...

} finally {

// Blok wykonywany w każdym przypadku

...

}

Konstrukcja obsługi wyjątku z klauzulą finally

Instytut Cybernetyki Technicznej Politechniki Wrocławskiej

J. Ułasiewicz Wyjątki w Javie 5

4 Generowanie

wyjątków

4.1 Deklarowanie metod generujących wyjątki

Jeżeli klasa może generować wyjątek musi to być wskazane przy definicji tej klasy.

Wskazanie że metoda może generować wyjątki odbywa się poprzez umieszczenie w jej deklaracji słowa kluczowego throws. Słowo throws umieścić należy po liście parametrów ale przed klamrą rozpoczynającą blok metody.

public int wstaw( Object item ) throws mojWyjatek {

...

}

Gdy metoda ma generować wiele wyjątków należy umieścić je kolejno: public int wstaw( Object item ) throws W1,W2,...,Wn

{

...

}

Klauzula throws oznacza że metoda może wygenerować wyjątek ale nie musi.

4.2 Propagacja wyjątku

Zamiast obsługiwać wyjątek w tej metodzie w której się objawia można delegować obsługę wyjątku do metody (klasy) nadrzędnej. Wtedy wyjątek musi być obsłużony w metodzie nadrzędnej.

Metoda 3

Metoda 2

Metoda 1

Wyjatek

Obsluga

Rys. 2 Propagacja wyjątku

Instytut Cybernetyki Technicznej Politechniki Wrocławskiej

J. Ułasiewicz Wyjątki w Javie 6

public void czytajPlik(String nazwa) {

...

try {

while(cnt < bufor.length) {

my.read(bufor);

cnt++;

}

} catch(IOException e) {

System.out.println("Blad czytania :" + e.getMessage());

}

}

Program 4 Obsługa wyjątku IOException w metodzie czytajPlik public void czytajPlik(String nazwa) throws IOException {

...

while(cnt < bufor.length) {

my.read(bufor);

cnt++;

}

}

Program 5 Przekazanie obsługi wyjątku IOException do metody nadrzędnej Instytut Cybernetyki Technicznej Politechniki Wrocławskiej

J. Ułasiewicz Wyjątki w Javie 7

4.3 Tworzenie i generowanie wyjątków

Aby wygenerować wyjątek należy:

1 Utworzyć nową instancję klasy reprezentującą wyjątki. Musi to być podklasa klasy Throwable.

2 Użyć polecenia throw.

...

KlasaWyjątku

iex = new

KlasaWyjątku();

throw iex;

...

Tworzenie i generowanie wyjątku

Możliwe jest obsłużenie wyjątku przekazanie go metody nadrzednej.

public void czytajPlik(String nazwa) throws IOException {

...

try {

...

} catch(IOException e) {

System.out.println("Blad czytania :" + e.getMessage()); throw e;

}

Program 6 Obsługa wyjątku i przekazanie go do metody wywołującej Nowy wyjątek musi być klasą podrzędną klasy Exception.

Aby wybrać odpowiedni wyjątek należy:

1. Z istniejących wyjątków należy wybrać taki który wydaje się najbardziej odpowiedni.

2. Gdy brak takiego należy utworzyć wyjątek jako podrzędny klasy Exception.

Klasy definiujące wyjątki posiadają dwa konstruktory:

1. Konstruktor bez argumentów

2. Konstruktor z jednym argumentem typu String który reprezentuje nazwę wyjątku. W takim konstruktorze należy wykonać konstruktor klasy nadrzędnej podając jako argument tę nazwę. Nazwa ta może być uzyskana przy pomocy metody getMessage().

public class MyException extends Exception {

public MyException() { }

public MyException(String s) {

super(s);

}

}

Instytut Cybernetyki Technicznej Politechniki Wrocławskiej

J. Ułasiewicz Wyjątki w Javie 8

public class ExceptionDemo {

static class MyException extends Exception {}

public static void wyjatek() throws MyException {

System.out.println("Zglaszam wyjatek! "); throw new MyException();

}

public static void main (String[] args) {

System.out.println("Start");

try {

wyjatek();

} catch (MyException e) {

System.out.println("Przechwycony");

}

}

}

Program 7 Przykład tworzenia i generowania wyjątku

5 Literatura

[1] Laura Lemay, Rogers Cadenhead, Java 2 dla każdego, Helion 2001.

[2] Bruce Eckel, Thinking in Java, wydanie 3, Helion 2003.

[3] Java 2 SDK, standard edition documentation version 1.4.1, http://www.sun.com/

Instytut Cybernetyki Technicznej Politechniki Wrocławskiej