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