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); } }