Obsługa wyjątków
Transcript of Obsługa wyjątków
1
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
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
4
Przykład – zgłoszenie wyj ątku
� if (t == null)– throw new NullPointerException ()
� uchwyt obiektu przekazywany jest do throw;� 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.
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 {….}
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
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
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 = "*" ;}
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)
11
Fraza:throws klasa_wyj ątków
� public staic void main(String args[]) throwsException {/*...*/}
� void printNumber(int number) throwsWrongNumberException {/*...*/}
12
Tworzenie własnych wyj ątków
� Przygotowanie klasy dziedziczącej po istniejącym typie wyjątku
� class SimpleException extends Exception{}
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!");� }� }� }
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);}
}
15
� class MyException extends Exception {� public MyException() {}� public MyException(String msg) {
� super(msg);� }
� }
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); }� }� }
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
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
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
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ł.
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
22
� Błąd, którego nie moŜna przewidzieć –referencja null z kodu, którego programista nie kontroluje
� ArrayIndexOutOfBoundsException
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 ;
}
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"� }� }� }� }
25
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 ";� }� }
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();� }� }� }
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
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ą:
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 {}
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.
32
Pakiety
� java.util.Date data = new java.util.Date();
� import java.util.*;
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
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.
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.
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;
}}
}
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
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 .
39
java.util.zip
� W pakiecie java.util.zip znajdują się klasy pozwalające tworzyć i czytać pliki skompresowane w formatach ZIP i GZIP.
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)
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.
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 .
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.
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.
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){ }
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){}
}