46
1 Obsluga wyjątków

Obsługa wyjątków

  • Upload
    builien

  • View
    236

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Obsługa wyjątków

1

Obsługa wyj ątków

Page 2: Obsługa wyjątków

2

Podstawy obsługi wyj ątków

� Problem, który wstrzymuje wykonanie metody lub bloku;

� Przykład dzielenie � 7/0, co oznacza wartość 0 w mianowniku??– Tworzony jest nowy obiekt wyjątku – new– ŚcieŜka wykonywana jest przerywana– Mechanizm obsługi wyjątków � procedura

obsługi wyjątków

Page 3: Obsługa wyjątków

3

Wyjątki

W języku Java istnieje bardzo rozbudowana hierarchia (drzewo) predefiniowanych klas wyjątków,których superklas ą jest klasa Throwable , a głównymi gałęziami drzewa są klasy Error i Exception .

Wyjątki pozwalają zachować kontrolę nad przebiegiem wykonania funkcji (metod), a takŜe pojedynczych instrukcji zawartych w funkcjach. Wyjątek jest zdarzeniem, które pojawia się podczas wykonania i rozrywa normalnąkolejność wykonania instrukcji.

- Wyjątki weryfikowalne

- Wyjątki nieweryfikowalne

Page 4: Obsługa wyjątków

4

Przykład – zgłoszenie wyj ątku

� if (t == null)– throw new NullPointerException ()

� uchwyt obiektu przekazywany jest do throw;� obsługa wyjątków

Page 5: Obsługa wyjątków

5

Wyjątki - throw

� Dla obsługi wyjątków weryfikowalnych wprowadzono cztery słowa kluczowe: throw , throws , try , catch i finally .

� Słowo kluczowe throwthrow słuŜy do jawnego zgłaszania wyjątków nieweryfikowalnych i występuje w instrukcji throw(throw wyra Ŝenie ; typu referencyjnego do klasy Throwable lub jej podklas).

� Zgłoszenie wyjątku w instrukcji throwthrow spowoduje natychmiastowe opuszczenie bloku zawierającego instrukcję throw i znalezienie instrukcji trytry , której fraza catchcatch przechwyci zgłoszony wyjątek.

� JeŜeli nie ma takiej instrukcji try, zostanie wywołana metoda UncaughtException i wykonanie programu (lub wątku) zostanie zakończone.

Page 6: Obsługa wyjątków

6

throw - try

� Wyrzucenie wyjątku (poprzez throw) z wnętrza metody powoduje przerwanie wykonywania tej metody – proces zwracania wyjątku

� Zablokowanie wyjścia z metody poprzez zastosowanie w metodzie bloku try

try {….}

Page 7: Obsługa wyjątków

7

Przechwycenie wyjatków try … catch…

� JeŜeli wykonanie pewnej instrukcji programu moŜe spowodować powstanie wyjątkowego zdarzenia, to ujmuje sięgo w blok instrukcji try , po którym muszą wystąpić procedury obsługi wyjątku mające postać frazy catch i bezpośrednio po catch (opcjonalnie) frazy finally .

� try {I}� catch(arg1 e1) {I} � catch(arg2 e2) {I} � ... � catch(argn en) {I} � ... � finally {I}

Sterowanie przekazywane jest dopierwszej w kolejno ści klauzulicatch, której „argument" (typwyjątku) pasuje do typupowstałego wyjątku

najpierw podawać BARDZIEJ SZCZEGÓŁOWE TYPY WYJĄTKÓW!!! switch - break

Page 8: Obsługa wyjątków

8

� KaŜdy z członów catch (procedura obsługi wyjątków) jest „metodą” pobierającą jeden parametr określonego typu

� Obsługa wyjątku jest dokonywana przez ten człon catch , której odpowiada typ wyrzuconego wyjątku.

� Obsługa dla pierwszej zgodności typu

Page 9: Obsługa wyjątków

9

Schemat obsługi wyj ątków

int a, b, c; String s;try {// wyj ątek ArithmeticException

s = Integer.toString(a);}

catch(ArithmeticException ex) {// wyj ątek jest obsługiwany w bloku catch

s = "*" ;}

Page 10: Obsługa wyjątków

10

Kończenie, wyznawanie w sytuacjach wyjątku

� Błąd krytyczny, brak moŜliwości powrotu do miejsca, w którym wystąpił wyjątek;

� Wznawianie, moŜliwość naprawiania sytuacji i ponownego wywołania metody (try w while)

Page 11: Obsługa wyjątków

11

Fraza:throws klasa_wyj ątków

� public staic void main(String args[]) throwsException {/*...*/}

� void printNumber(int number) throwsWrongNumberException {/*...*/}

Page 12: Obsługa wyjątków

12

Tworzenie własnych wyj ątków

� Przygotowanie klasy dziedziczącej po istniejącym typie wyjątku

� class SimpleException extends Exception{}

Page 13: Obsługa wyjątków

13

� public class SimpleExceptionDemo {� public void f() throws SimpleException {� System.out.println( "Wyrzucam SimpleException z f()");

� throw new SimpleException ();� }� public static void main (String[] args) {� SimpleExceptionDemo sed = new SimpleExceptionDemo();� try {� sed.f();� } � catch(SimpleException e) {� System.err.println("Złapałem!");� }� }� }

Page 14: Obsługa wyjątków

14

Własne wyj ątki

Wyjątki są obiektami klas pochodnych od Throwable.

Aby stworzyć własny wyjątek, naleŜy zdefiniować odpowiednią klasę.

Zgodnie z konwencją dziedziczymy podklasę Throwable - klasęException .

class NaszWyj extends Exception{. . . . . .

void naszaMetoda() throws NaszWyj{

. . . . .if (bł ąd)throw new

NaszWyj(ew_param_konstruktora_z_info_o_bł ędzie);}

}

Page 15: Obsługa wyjątków

15

� class MyException extends Exception {� public MyException() {}� public MyException(String msg) {

� super(msg);� }

� }

Page 16: Obsługa wyjątków

16

� public class FullConstructors {� public static void f() throws MyException {� System.out.println( "Wyrzucam MyException z f()");� throw new MyException();� }� public static void g() throws MyException {� System.out.println("Wyrzucam MyException z g()");� throw new MyException("Pochodzę z g()");� }� public static void main (String[] args) {� try {� f();� } catch (MyException e) {e.printStackTrace(System.err);}� try {� g();� } catch (MyException e) { e.printStackTrace(System.err); }� }� }

Page 17: Obsługa wyjątków

17

printStackTrace

� Metoda klasy Throwable� Wyświetla informacje o wszystkich metodach, które

zostały wywołane, do miejsca, w którym zgłoszono wyjątek

Page 18: Obsługa wyjątków

18

Specyfikacja wyj ątków - throws

� Informowanie o wyjątkach jakie mogą zostaćwyrzucone przez metodę

� w przypadku int f() {…} oznacza, Ŝe Ŝadne wyjątki nie są wyrzucane z tej metody – oprócz RunTimeException

� Jeśli metoda powoduje wyjątki to musi je obsłuŜyć, albo zaznaczyć w specyfikacjiwyjątków – kompilacja

Page 19: Obsługa wyjątków

19

� public class ExceptionMethods {� public static void main (String[] args) {� try {

� throw new Exception ("Oto mój Wyjątek");

� } catch( Exception e) {� System.err.println("Złapałem wyjątek");

� System.err.println("e.getMessage(): " + e.getMessage());

� System.err.println( "e.getLocalizedMessage(): " +� e.getLocalizedMessage());

� System.err.println("e.toString(): " + e);� System.err.println("e.printStackTrace():");� e.printStackTrace(System.err);� }� }� }

Przechwytywanie dowolnego wyj ątku

Page 20: Obsługa wyjątków

20

Standardowe wyj ątki Javy

� Klasa Throwable �

– Error - błędy kompilacji oraz systemu,– Exception – podstawowy typ wyrzucony z

dowolnej metody klasy biblioteki Javy

� Nazwa wyjątku określa problem, jaki wystąpił.

Page 21: Obsługa wyjątków

21

RuntimeException – klasa bazowa

� if (t == null)– throw new NullPointerException ()

� Sprawdzenie czy referencja ma wartość nulldokonywane jest przez przy kaŜdym wywołaniu metody – standardowa procedura Javy

� Nie ma potrzeby podawania w specyfikacji, Ŝe metoda moŜe zgłosić wyjątek RuntimeException

Page 22: Obsługa wyjątków

22

� Błąd, którego nie moŜna przewidzieć –referencja null z kodu, którego programista nie kontroluje

� ArrayIndexOutOfBoundsException

Page 23: Obsługa wyjątków

23

Klauzula finally – wykonywana bez względu czy wyj ątek zgłoszony czy nie

Był wyjątek?

przerwij try uruchomjest klauzulę catch.

wykonaj klauzulęfinally

wykonaj klauzulęfinally

Przejdź do następnejlinii programu

TAK

NIE

boolean metoda(...){

try{

/*instrukcje,które mog ą

spowodować wyj ątek*/}catch (Exception e){

return false ; } finally{

/* uporz ądkowanie, np. zamkni ęcie pliku*/

} return true ;

}

Page 24: Obsługa wyjątków

24

� class ThreeException extends Exception {}� public class FinallyWorks {� static int count = 0;

� public static void main(String[] args) {� while(true) {� try {

if(count++ == 0)� throw new ThreeException();� System.out.println("Nie ma wyjątku");� } catch (ThreeException e) {� System.err.println("ThreeException");� } finally {� System.err.println("Jestem w sekcji finally ");� if(count == 2) break; // wyjdź z "while"� }� }� }� }

Page 25: Obsługa wyjątków

25

Page 26: Obsługa wyjątków

26

try … finally

� class VeryImportantException extends Exception {� public String toString() {� return "Bardzo waŜny wyjątek!";� }� }

� class HoHumException extends Exception {� public String toString() {� return "Trywialny wyjątek ";� }� }

Page 27: Obsługa wyjątków

27

� public class LostMessage {� void f() throws VeryImportantException {� throw new VeryImportantException();� }� void dispose() throws HoHumException {� throw new HoHumException();� }

� public static void main(String[] args) � throws Exception {� LostMessage lm = new LostMessage();� try {� lm.f();� } finally {� lm.dispose();� }� }� }

Page 28: Obsługa wyjątków

28

Wyjątki a dziedziczenie

� W metodzie przeci ąŜonej moŜna zgłaszaćte wyjątki, które zostały podane w specyfikacji jej wersji z klasy bazowej ;

� Ograniczenia nie stosują się do konstruktorów

� Konstruktor klasy pochodnej nie moŜe przechwytywać wyjątków zgłaszanych przez konstruktor klasy bazowej

Page 29: Obsługa wyjątków

29

� abstract class Inning {� Inning() throws BaseballException {}� void event () throws BaseballException {}� abstract void atBat() throws Strike, Foul; � void walk() {}� }

� interface Storm { � void event() throws RainedOut; � void rainHard() throws RainedOut;� }

class BaseballException extends Exception {}class StormException extends Exception {}class RainedOut extends StormException {}

public class StormyInning extends Inning implements Storm {StormyInning() throws RainedOut, BaseballException {}StormyInning(String s) throws Foul, BaseballException {}

// Normalne metody muszą być zgodne z klasą bazową:

Page 30: Obsługa wyjątków

30

� //! void walk() throws PopFoul {} //Błąd kompilacji

� // Interfejsy (Storm) NIE MOGĄ dodawać wyjątków do� // metod istniejących w klasie bazowej (Inning):

� //! public void event() throws RainedOut {}

� // MoŜna dodać wyjątek, jeśli metoda nie � // istnieje jeszcze w klasie bazowej:

� public void rainHard() throws RainedOut {}

� // MoŜna zdecydować, Ŝe nie będzie zgłaszany Ŝaden

� // wyjątek, nawet jeśli wersja bazowa coś zgłasza – metoda przesłoni ęta:

� public void event() {}

� // Metody przeciąŜone mogą zgłaszać� // przeciąŜone wyjątki:

� void atBat() throws PopFoul {}

Page 31: Obsługa wyjątków

31

Standardowe klasy Javy

� java.applet, java.awt, java.beans, java.io, java.lang, java.math, java.net, java.rmi, java.security, java.sql, java.text, java.util, javax.accessibility, javax.swing, org.omg.

Page 32: Obsługa wyjątków

32

Pakiety

� java.util.Date data = new java.util.Date();

� import java.util.*;

Page 33: Obsługa wyjątków

33

java.lang

� W pakiecie java.lang zdefiniowana jest klasa Object , która jest klasą nadrzędną wobec wszystkich innych klas Javy.

� Boolean, Byte, Integer, Long, Double, Character itd.,

� Klasa Math� Klasa Thread

Page 34: Obsługa wyjątków

34

java.lang

� 2 klasy obsługujące łańcuchy znaków: String i StringBuffer .

� Klasa String uŜywana jest do przechowywania i wykonywania operacji na stałych ła ńcuchach ; po utworzeniu obiektu tej klasy nie moŜna zmienićjego wartości.

� Klasa ta zawiera metody:– do sprawdzania poszczególnych znaków, porównywania łańcuchów,

wyodrębniania podłańcuchów, tworzenia kopii z zamianą na małe albo duŜe litery.

� Klasa StringBuffer implementuje łańcuchy znaków, które mogą byćzmieniane . Podstawowe metody tej klasy to append dodająca znaki na końcu bufora i insert wstawiająca znaki w określonym miejscu.

� KaŜdy obiekt przydziela bufor na przechowywany łańcuch znaków. JeŜeli całkowita długość łańcucha wzrośnie powyŜej rozmiaru bufora, automatycznie przydzielany jest większy.

Page 35: Obsługa wyjątków

35

Pakiet java.io

� definiuje klasy implementujące operacje wejścia-wyjścia.� Reader wraz z podklasami:

– BufferedReader, – CharArrayReader, – InputStreamReader, – FileReader, – StringReader

� Writer wraz z podklasami:– BufferedWriter, – CharArrayWriter, – OutputStreamWriter, – FileWriter,– PrintWriter, – StringWriter.

Page 36: Obsługa wyjątków

36

import java.io.*;import java.util.*;

public class czytam {public static void main (String args[]){

EasyIn easy = new EasyIn();System.out.print("enter float: "); System.out.flush();System.out.println("You entered: " + easy.readFloat() );float a=easy.readFloat();System.out.println("You entered: " + a);}

}

class EasyIn

{static InputStreamReader is = new InputStreamReader( System.in );static BufferedReader br = new BufferedReader( is );StringTokenizer st;StringTokenizer getToken() throws IOException {

String s = br.readLine();return new StringTokenizer(s);

}float readFloat() {

try {st = getToken();return new Float(st.nextToken()).floatValue();

} catch (IOException ioe) {System.err.println("IO Exception in EasyIn.readFloat");return 0.0F;

}}

}

Page 37: Obsługa wyjątków

37

pakiet java.util

� szereg klas definiujących róŜne struktury danych przechowujące inne obiekty.

� Klasa Vector implementuje tablicę obiektów, która moŜe rosnąć lub zmniejszać się w miarę jak obiekty są dodawane lub usuwane.

� Wszystkie elementy wektora najwygodniej jest przeglądać wykorzystując interfejs Enumeration

Page 38: Obsługa wyjątków

38

� Gdy wektor zajmuje całą przydzieloną pamięć, przed dodaniem kolejnego elementu jego rozmiar jest automatycznie zwiększany o wartość capacityIncrement .

� Program moŜe jednak sam zwiększyć rozmiar wektora przed wstawieniem duŜej porcji danych, aby uniknąć wielu realokacji .

� Podklasą klasy Vector jest Stack realizujący kolejkę LIFO obiektów z metodami push i pop .

Page 39: Obsługa wyjątków

39

java.util.zip

� W pakiecie java.util.zip znajdują się klasy pozwalające tworzyć i czytać pliki skompresowane w formatach ZIP i GZIP.

Page 40: Obsługa wyjątków

40

Pakiet java.net

� Pakiet java.net zawiera klasy realizujące połączenia sieciowe zarówno na poziomie gniazd, jak i adresów URL wskazujących zasoby w WWW. Podstawowe klasy to:

– Socket, URL, URLConection.

Pakiet java.sql

Jednolity standard dostępu do dowolnych relacyjnych baz danych. Klasy z tego pakietu implementują połączenia z bazą danych, zapytania SQL, wyniki tych zapytań itp.

Driver JDBC (Java DataBase Conectivity)

Page 41: Obsługa wyjątków

41

java.rmi

� RMI (Remote Method Invocation ) zawarty w java.rmi umoŜliwia tworzenie rozproszonych aplikacji w Javie.

� RMI zapewnia mechanizm, poprzez który odbywa się komunikacja pomiędzy serwerem i klientem oraz przesyłane są dane w obie strony.

org.omgWspiera powszechnie przyjęty standard modelu rozproszonych obiektów – CORBA (Common Object Request BrokerageArchitecture). Pozwala on na komunikację pomiędzy obiektami bez względu na platformę systemu operacyjnego, ani uŜyty języka programowania.

Page 42: Obsługa wyjątków

42

pakiet java.awt

� Aplety i aplikacje Javy komunikują się z uŜytkownikiem wykorzystując klasy z pakietu java.awt składające się na graficzny interfejs uŜytkownika AWT (Abstract WindowToolkit).

� AWT dostarcza typowe komponenty graficzne takie, jak klawisze, pola do wprowadzania tekstu, listy wyboru itd. poprzez klasy:

� Button, � Checkbox, � Choice, � Label, � List, � Menu, � Scrollbar,� TextArea, � TextField będące pochodnymi klasy Component.

� Wykorzystując klasę Canvas , moŜna rysować dowolne obrazy graficzne na ekranie;

� Po dodaniu odpowiedniej obsługi zdarzeń moŜna zdefiniować dowolny własny komponent .

Page 43: Obsługa wyjątków

43

model obsługi zdarze ń

� W modelu 1.1 AWT zdarzenia są generowane przez źródła,którymi mogą być komponenty interfejsu uŜytkownika, myszka, klawiatura itd.

� MoŜe być wydelegowany jeden lub więcej odbiorców zdarzenia pochodzącego od określonego źródła, który jest obiektem dowolnej klasy implementującej przynajmniej jeden z interfejsów obsługi zdarzeń takich, jak:

� ActionListener, � KeyListener,� MouseListener.

Page 44: Obsługa wyjątków

44

pakiet javax.swing

� W skład JDK 1.2 został włączony pakiet javax.swing nazywany równieŜJava Foundation Classes (JFC), znacznie rozszerzający moŜliwości funkcjonalne interfejsu graficznego uŜytkownika.

� Pakiet ten zawiera znacznie więcej komponentów graficznych , pozwala dynamicznie imitować znane środowiska graficzne (np. Windows, CDE/Motif),

� umoŜliwia korzystanie z urządzeń pomocniczych w odczytywaniu informacji (jak np. czytniki ekranu, wyświetlacze Braille’a),

� zawiera bogatą bibliotekę do tworzenia dwuwymiarowej grafiki , wspomaga technikę “przeci ągnij i upu ść” pomiędzy aplikacjami Javy i aplikacjami w danym systemie operacyjnym.

Page 45: Obsługa wyjątków

45

import java.awt.*;import java.awt.event.*;

publicclass HelloApp extends Frame implementsWindowListener{

public HelloApp (){

super ();addWindowListener(this );setSize(320, 200);setVisible(true );

}public void paint(Graphics gDC){

gDC.drawString ("To jest aplikacja", 120, 100);}public static void main(String args[]){

new HelloApp();}

}

public void windowClosing(WindowEvent e){ System.exit(0); }public void windowClosed(WindowEvent e){ }public void windowOpened(WindowEvent e){ }public void windowIconified(WindowEvent e){ }public void windowDeiconified(WindowEvent e){ }public void windowActivated(WindowEvent e){}public void windowDeactivated(WindowEvent e){ }

Page 46: Obsługa wyjątków

46

import java.awt.*;import java.awt.event.*;

publicclass HelloApp extends Frame implements WindowListener{

public HelloApp (){

super();addWindowListener(this);setSize(320, 200);setTitle("Moja aplikacja w Javie");MenuBar menuBar = new MenuBar();setMenuBar(menuBar);Menu menu = new Menu("Plik");menu.add(new MenuItem("Zamknij"));menuBar.add(menu);setVisible(true);

}public void paint(Graphics gDC){

gDC.drawString ("To jest aplikacja", 120, 100);}public static void main(String args[]){

new HelloApp();}public void windowClosing(WindowEvent e){

System.exit(0);}public void windowClosed(WindowEvent e){}public void windowOpened(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowDeactivated(WindowEvent e){}

}