Moduł 8 œ Obsługa błędów

Transkrypt

Moduł 8 œ Obsługa błędów
MODU 8 – OBS UGA B DÓW
87
Modu 8 – Obs uga b dów
Zawarto
jednostki
Po zrealizowaniu jednostki b dziesz w stanie:
kontrolowa prawid owe dzia anie programu
obs ugiwa programowo b dy powsta e w trakcie dzia ania programu
definiowa obs ug w asnych sytuacji wyj tkowych
Wprowadzenie
Praktycznie ka dy program komputerowy zawiera b dy. Tworz c kod programu, programista stara si je
w maksymalnym stopniu eliminowa . Niektóre z nich mo liwe s do zdiagnozowania ju na etapie
kompilacji (dotyczy to przede wszystkim b dów sk adniowych kodu programu). Jednak e pewne b dy
ujawniaj si dopiero w momencie wykonania programu. Ich obs uga jest warunkiem dalszego
prawid owego dzia ania programu.
Przechwytywanie i obs uga wyj tków
WYJ TKI I ICH STRUKTURA
Gdy system napotka instrukcje programu, której nie jest w stanie poprawnie wykona , powstaje sytuacja
wyj tkowa. Zg aszany jest wtedy tzw. wyj tek (ang. exception). Jest to obiekt wywodz cy si z klasy
Throwable lub klasy pochodnej:
Throwable
Error
...
Exception
...
RuntimeException
...
Rys. 2. Struktura wyj tków
Poni szy kod zwiera instrukcj , która spowoduje b d wykonania programu. W przedstawionym
przyk adzie zostanie zg oszony wyj tek ArithmeticException.
MODU 8 – OBS UGA B DÓW
88
public void podziel(){
System.out.println("Wykonuj$ operacj$ dzielenia...");
double x = 5.0/0;
// miejsce powstania wyj*tku ArithmeticException
System.out.println("Rezultat dzielenia: " + x);
System.out.println("Operacja dzielenia wykonana.");
}
Klasa Exception oraz jej klasy pochodne opisuj te wyj tki, które odnosz si do wykonywanego
programu w Javie. Gdy pojawia si sytuacja wyj tkowa (b d w programie), tworzony jest obiekt101 klasy
Exception (lub klasy pochodnej) i przekazywany do JVM. Przyk adowe klasy reprezentuj ce t
kategori b dów to:
Klasa Error wraz z jej klasami pochodnymi opisuje te wyj tki, które odnosz si do JVM. Tworzone na
podstawie tych klas obiekty reprezentuj powa ne b dy systemowe wyst puj ce w trakcie wykonywania
programu. Przyk adami mog tu by :
WYJ TKI KONTROLOWANE I NIEKONTROLOWANE
J zyk Java wprowadza podzia wszystkich wyj tków na niekontrolowane oraz kontrolowane. Te ostatnie
musz zosta obs u one bezpo2rednio w kodzie programu. Brak obs ugi wyj tku kontrolowanego
spowoduje b d kompilacji.
Wyj tki kontrolowane (wywodz ce si z klasy Exception, oprócz klasy RuntimeException)
pojawiaj si najcz 2ciej w sytuacji, gdy wykonywany program próbuje skorzysta z dost pnych zasobów
(odczyt lub zapis do pliku, próba dost pu do bazy danych, zasobów w sieci Internet) i operacja taka
ko4czy si niepowodzeniem. Je2li wywo ywana metoda wyst puj ca w kodzie programu zg asza wyj tek
kontrolowany, niezb dne jest jego przechwycenie oraz obs uga za pomoc instrukcji try..catch lub
te przekazanie go do metody nadrz dnej (wywo uj cej). Wymagane jest wtedy u ycie klauzuli throws
umieszczonej w nag ówku metody nadrz dnej, która zawiera musi nazwy wszystkich zg aszanych
wyj tków102:
public void odczytZawartosciPliku() throws IOException {
...
// konieczne jest u2ycie try..catch
// lub przekazanie wyj*tku metodzie nadrz$dnej (klauzula throws)
FileReader fr = new FileReader("dane.txt");
BufferedReader br = new BufferedReader(fr);
String line = br.readLine()
...
}
Przyk adami wyj tków kontrolowanych s :
• FileNotFoundException (próba dost pu do nieistniej cego pliku),
• UnknownHostException (b dy adres dost pu do zasobu w sieci Internet)
• SQLException (b d dost pu do zasobów bazy danych)
Wyj tki niekontrolowane (wywodz ce si z klasy Error lub RuntimeException) zwi zane s
najcz 2ciej z b dami logicznymi wyst puj cymi w programie lub te b dami JVM. Typowe przyk ady
to:
• ArithmeticException (problem z wykonaniem operacji arytmetycznej, np. próba dzielenia
przez zero),
• ArrayIndexOutOfBoundsException (odwo anie do nieistniej cego elementu tablicy),
• OutOfMemoryError (brak pami ci)
• StackOverflowError (przepe nienie pami ci stosu)
Wyj tki wywodz ce si z klasy Error oznaczaj najcz 2ciej powa ne problemy systemowe. St d ich
obs uga nie zawsze jest mo liwa.
101
102
Obiekt mo e zosta utworzony bezpo2rednio w programie (instrukcja throw) lub te wygenerowany przez JVM.
Brak nazwy wyj tku kontrolowanego w nag ówku metody, w której mo e on wyst pi powoduje b d kompilacji.
MODU 8 – OBS UGA B DÓW
89
INSTRUKCJA TRY..CATCH
Je2li kod programu nie zawiera instrukcji obs ugi zg oszonego wyj tku, program ko4czy dzia anie
wy2wietlaj c na konsoli informacj o powsta ym b dzie103. Mo liwe jest jednak przechwycenie
zg oszonego wyj tku i programowa jego obs uga. Aby mo liwe by o przechwycenie wyj tku, nale y
umie2ci instrukcje mog ce spowodowa b d wewn trz bloku instrukcji try:
public void podziel(){
try {
System.out.println("Wykonuj$ operacj$ dzielenia...");
double x = 5.0/0;
System.out.println("Rezultat dzielenia: " + x);
...
}
catch (ArithmeticException e){
System.out.println("Niestety, dzielenie przez 0 nie jest dozwolone!");
System.out.println("Wprowad? inne, poprawne argumenty dzia@ania.");
}
finally {
// dodatkowe instrukcje (opcjonalnie)
}
// dalsze instrukcje metody
System.out.println("Operacja dzielenia wykonana.");
...
...
}
Je2li którakolwiek z instrukcji umieszczonych wewn trz bloku try spowoduje b d, wykonanie
programu zostanie przerwane, a sterowanie przekazane do bloku instrukcji catch104. Je2li typ
powsta ego wyj tku jest zgodny z wymienionym typem w instrukcji catch(), zostan wykonane
wszystkie instrukcje znajduj ce si wewn trz bloku catch. Nast pnie sterowanie przebiegiem
wykonania programu zostanie przekazane do kolejnych instrukcji wyst puj cych po bloku catch.
Mo liwe jest umieszczenie po catch bloku finally, którego instrukcje zostan wykonane niezale nie
od powsta ych w bloku try b dów. W finally umieszczane s z regu y polecenia, zadaniem których
jest zarz dzanie zasobami systemu (np. zamkni cie pliku, zwolnienie nieu ywanego zasobu pami ci).
Je2li wyj tek nie zostanie przechwycony i obs u ony w metodzie, w której wyst pi , przekazywany jest
do metod wywo uj cych, z których ostatnia to metoda main(). Gdy w adnej z metod nie nast pi
przechwycenie i obs uga wyj tku, program ko4czy dzia anie wy2wietlaj c na konsoli komunikat o
powsta ym b dzie.
WYRZUCANIE WYJ TKU
Oprócz wyj tków zg aszanych przez JVM, mo liwe jest programowe zg aszanie wyj tków bezpo2rednio
w kodzie programu. Poni szy fragment zawiera instrukcj zg aszaj c wyj tek (throw) w przypadku,
gdy nast pi próba odwo ania do nieistniej cego elementu tablicy:
int[] tab = new int[3];
for (int i=0; i<=3; i++) {
if (i >= 3) {
throw new ArrayIndexOutOfBoundsException("Przekroczony zakres tablicy");
}
tab[i] = 5;
}
TWORZENIE NOWEJ KLASY WYJ TKU
Mechanizm obs ugi wyj tków dost pny w j zyku Java umo liwia rozbudow struktury klas o nowe
kategorie wyj tków. Nowe klasy nale y tworzy na podstawie klasy Exception lub klas pochodnych.
Klasy takie zawieraj najcz 2ciej zadeklarowane jawnie konstruktory umo liwiaj ce przekazanie
informacji o powsta ym b dzie:
103
Wy2wietlany komunikat zawiera nazw wyj tku oraz miejsce, w którym zosta zg oszony.
Blok programu try dopuszcza wyst powanie dowolnej liczby bloków catch(). Kolejno2 ich wyst powania jest
istotna i 2ci2le zale na od struktury klas (zobacz schemat).
104
MODU 8 – OBS UGA B DÓW
90
class WyjatekLiczbaNaturalna extends Exception {
public WyjatekLiczbaNaturalna(){
super("Nieprawid@owa liczba naturalna.");
}
public WyjatekLiczbaNaturalna(String komunikat){
super(komunikat);
}
}
Po utworzeniu nowej klasy wyj tku mo liwe jest zg aszanie wyj tków utworzonego typu:
if (liczba < 1){
throw new WyjatekLiczbaNaturalna();
}
Zg oszony wyj tek mo e by
try..catch.
nast pnie przechwycony i obs ugiwany za pomoc
instrukcji
Pytania sprawdzaj ce
1. Wymie4 zalety stosowania procedury obs ugi wyj tków.
2. Co oznaczaj nast puj ce wyj tki: ArrayIndexOutOfBoundsException,
NumberFormatException, NullPointerException?
3. Jaki wyj tek zg asza metoda charAt() klasy String? Sprawd= w dokumentacji Javy.
4. Czym charakteryzuj si wyj tki kontrolowane? Z jakich klas si wywodz ?
5. Do jakiej kategorii nale y wyj tek FileNotFoundException ?
6. Scharakteryzuj sk adni instrukcji catch.
7. Wska zastosowania, jakie pe ni blok instrukcji finally
8. Jak funkcj pe ni klauzula throws w nag ówku metody?
9. Podaj nazwy klas, z których dziedziczy mog nowo tworzone wyj tki.
10. Omów sk adni instrukcji throw. Jak funkcj pe ni ta instrukcja? Podaj przyk ady u ycia.
Zadania do wykonania
Zadanie 128 – OceanWspak.java
Poni szy kod zawiera program wy2wietlaj cy na konsoli napis wspak. Dokonaj analizy programu i w
miejsce TYP-WYJATKU wprowad= poprawn nazw klasy. W przypadku trudno2ci sprawd= w
dokumentacji Javy, jaki wyj tek zg aszany jest przez metod charAt() klasy String.
public class OceanWspak {
public static void main(String[] args) {
String ocean = "Ocean Indyjski";
try {
for(int i=ocean.length(); i>=0; i--)
System.out.print(ocean.charAt(i));
}
catch(TYP-WYJKTKU e){
System.out.println("Program zosta@ wykonany nieprawid@owo!");
}
}
}
Zadanie 129 – SumaLiczbCalkowitych.java
Napisz program, którego zadaniem jest wyznaczenie sumy liczb ca kowitych wprowadzonych z
konsoli.
MODU 8 – OBS UGA B DÓW
91
Rozwi zanie
Poni szy kod programu zawiera rozwi zanie zadania. Zwró uwag na zawart w kodzie programu
obs ug b dów umo liwiaj c weryfikacj poprawno2ci wprowadzonych danych.
import java.util.*;
public class SumaLiczbCalkowitych {
public static void main(String[] args) {
int sumaLiczb = 0;
int liczbaCalkowita = 0;
System.out.println("Wprowad? liczby ca@kowite.");
System.out.println("WartoOP 0 koQczy wprowadzanie.\n");
Scanner sc = new Scanner(System.in);
do {
try {
System.out.print("Liczba ca@kowita: ");
liczbaCalkowita = sc.nextInt();
sumaLiczb += liczbaCalkowita;
}
catch (InputMismatchException e){
System.out.println("Wprowadzona wartoOP \""
+ sc.nextLine() + "\" jest niepoprawna!!!");
}
} while (liczbaCalkowita!=0);
System.out.println("Suma wprowadzonych wartoOci: " + sumaLiczb);
}
}
Zadanie 130 – DzieleniePrzezZero.java
Napisz program obliczaj cy iloraz dwóch liczb ca kowitych wprowadzonych z konsoli.
Rozwi zanie
Uwzgl dnij w programie mo liwo2 wyst pienia sytuacji wyj tkowych:
• u ytkownik wprowadzi nieprawid owe dane (np. ci g znaków nie b d cy liczb ca kowit ),
• warto2 dzielnika wynosi zero.
Zadanie 131 – WielkoscWynagrodzenia.java
Grzegorz Wojdacki jest pracownikiem fizycznym firmy MILENA sp. z o.o. Jego wynagrodzenie
wyznaczane jest wg formu y:
wynagrodzenie
=
liczba przepracowanych godzin
x
stawka za 1 godzin$ w z@ i gr.
Napisz program, który na podstawie tych dwóch warto2ci (liczba godzin, stawka) odczytanych z
wiersza polece4 obliczy wielko2 wynagrodzenia pracownika. Uwzgl dnij w programie mo liwo2
wyst pienia sytuacji wyj tkowych.
Zadanie 132 – PierwiastekKwadratowy.java
Poni szy kod programu zawiera metod wyznaczaj c
dowolnej nieujemnej warto2ci rzeczywistej:
warto2
pierwiastka kwadratowego dla
public static double pierwiastekKwadratowy(double x){
if(x<0){
throw new IllegalArgumentException("Brak pierwiastków dla wartoOci ujemnych");
} else {
return Math.sqrt(x);
}
}
Napisz program, który stosuj c powy sz metod obliczy warto2 pierwiastka kwadratowego dla
dowolnej warto2ci rzeczywistej odczytanej z konsoli. Uwzgl dnij w programie mo liwo2
wyst pienia sytuacji wyj tkowych (u yj instrukcji try..catch). Nast pnie spróbuj wykona
obliczenia dla niedopuszczalnej warto2ci, np. -7.
MODU 8 – OBS UGA B DÓW
92
Zadanie 133 – SredniaPredkoscRoweru.java
Licznik rowerowy podaje ca kowity przebyty dystans oraz efektywny czas jazdy roweru (bez
postojów). Utwórz metod o nag ówku jak poni ej, która na podstawie tych 2 warto2ci obliczy
pr dko2 jazdy roweru zgodnie ze wzorem v=s/t, gdzie s oznacza przebyty dystans, a t czas jazdy.
public static double sredniaPredkoscRoweru(double s, double t) {}
Nast pnie napisz program, który na podstawie danych odczytanych z konsoli wyznaczy 2redni
pr dko2 jazdy roweru.
Rozwi zanie
Utworzona metoda powinna weryfikowa poprawno2
generuj c wyj tek, gdy warto2ci te s niedopuszczalne.
warto2ci przekazywanych parametrów
Zadanie 134 – SystemyLiczbowe.java
System szesnastkowy to system o podstawie 16, wykorzystuj cy do zapisu 16 znaków (cyfry 0..9 oraz
litery A, B, C, D, E i F). Poni szy nag ówek okre2la metod , zadaniem której jest konwersja liczby z
systemu szesnastkowego na dziesi tny:
public static long hex2dec(String hex){}
Utwórz powy sz metod uwzgl dniaj c nast puj ce za o enie: metoda powinna zg asza wyj tek,
je2li warto2 parametru (hex) nie jest prawid ow liczb w systemie szesnastkowym. Nast pnie
napisz program, który na podstawie warto2ci parametru wiersza polece4 dokona konwersji odczytanej
warto2ci w systemie szesnastkowym na system dziesi tny.
Zadanie 135 – TemperaturaPomieszczenia.java
W pomieszczeniu zamontowano regulator temperatury sterowany komputerowo. Poni szy program
napisany w j zyku Java steruje urz dzeniem. Uzupe nij kod programu we wskazanym miejscu, aby
zawiera on ustawienie nast puj cych warto2ci temperatury: 19.6C, 17.2C, 27.4C. Po ka dej zmianie
warto2ci temperatury wy2wietl jej bie c warto2 na konsoli.
public class TemperaturaPomieszczenia {
private final double TEMP_MAX = 25.0;
private final double TEMP_MIN = 15.0;
private double temperatura;
public static void main(String[] args) {
TemperaturaPomieszczenia kuchnia = new TemperaturaPomieszczenia();
System.out.println("ELEKTRONICZNY REGULATOR TEMPERATURY");
// tu zmieQ i odczytaj temp.
}
public void ustawTemperature(double temp) throws TemperaturaException {
if ((temp < TEMP_MIN) || (temp > TEMP_MAX)){
throw new TemperaturaException();
} else {
temperatura = temp;
}
}
public double pobierzTemperature(){
return temperatura;
}
}
class TemperaturaException extends Exception {
public TemperaturaException(){
super("Temperatura poza dopuszczalnym zakresem.");
}
public TemperaturaException(String komunikat){
super(komunikat);
}
}

Podobne dokumenty