Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Podobne dokumenty
Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Wykład 8: Obsługa Wyjątków

Języki i metody programowania Java INF302W Wykład 3 (część 1)

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Java SE Laboratorium nr 4. Temat: Obsługa wyjątków i zdarzeń

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

Aplikacje w środowisku Java

Wyjątki (exceptions)

Programowanie obiektowe

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Programowanie Obiektowe Ćwiczenie 4

Zaawansowane programowanie w języku C++ Wyjątki

Wykład 04. Programowanie obiektowe. Maciej Wołoszyn 17 marca Spis treści

Efekty uboczne błędów

Programowanie obiektowe

Obsługa wyjątków. Język C++ WW12

Język C++ wykład VIII

Podstawy i języki programowania

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Klasy cd. Struktury Interfejsy Wyjątki

Obsługa wyjątków. Rysunek 2-4 Hierarchia dziedziczenia klas wyjątków

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Multimedia JAVA. Historia

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Dawid Gierszewski Adam Hanasko

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Praktyczny kurs Java

Dziedziczenie. Tomasz Borzyszkowski

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Programowanie w języku C++

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie obiektowe

Programowanie obiektowe w języku

Materiały do zajęć III

Wykład 2: Podstawy Języka

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Konwencje obsługi błędów

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

MATERIAŁY POMOCNICZE DO ĆWICZENIA 3 Klasy i obiekty; atrybuty i metody

Klasyfikacja wyjątków

Zaawansowane techniki programowania C#

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Struktura programu: package pl.mojastrona.mojpakiet; import javax.swing.*; import java.awt.container; class MojaKlasa extends Jframe {

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie w języku Java WYKŁAD

1. Język JAVA. 1. Pierwszy program. 2. Kalkulator. 3. Klasy. 4. Dziedziczenie

Wywoływanie metod zdalnych

Mechanizm dziedziczenia

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Klasy abstrakcyjne, interfejsy i polimorfizm

Ł Ą Ż Ą Ż Ż ź

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Ó Ż Ó ź Ć

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Ą Ą ć Ę ć

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Szablony funkcji i klas (templates)

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Techniki zabezpieczania kodu - kontrola wyjatków. Temat VIII

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Oracle PL/SQL. Paweł Rajba.

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie w Javie wykład 7 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Bloki inicjalizacyjne

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

WSNHiD, Programowanie 2, Lab. 3. Trwałość danych

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Przypomnienie o klasach i obiektach

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Aplikacje w środowisku Java

Szablony klas, zastosowanie szablonów w programach

Java. Leksykon kieszonkowy. Wydanie II

Podstawy Języka Java

Podstawy i języki programowania

PARADYGMATY PROGRAMOWANIA Wykład 4

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Materiały do zajęć VII

Programowanie obiektowe

Katalog książek cz. 2

Programowanie obiektowe zastosowanie języka Java SE

Transkrypt:

Wyjątki 180 / 196

Wyjątki W Javie istnieje mechanizm tzw. wyjątków (ang. exception), który pozwala na przechwytywanie błędów pojawiających się w programie. Kompilacja tab [ 1 0 ] = 100; spowoduje powstanie wyjątku związanego z przekroczeniem dopuszczalnego zakresu tablicy: E x c e p t i o n i n t h r e a d " main " j a v a. l a n g. A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n : 10 a t Main. main ( Main. j a v a : 4 ) 181 / 196

Gdyby możliwości wyjątków kończyły się na wyświetlaniu informacji na ekranie i przerywaniu działania programu, ich przydatność byłaby mocno ograniczona. Wygenerowany wyjątek można jednak przechwycić i wykonać własny kod obsługi błędu. Służy do tego blok instrukcji try...catch. Schemat bloku try...catch instrukcje mogące spowodować wyjątek catch (TypWyjątku identyfikatorwyjątku) { obsługa wyjątku Na stronie https://docs.oracle.com/javase/8/docs/api/index.html w pakiecie java.lang. w Exception Summary zebrano różne rodzaje wyjątków, np: ArithmeticException InstantiationException ArrayIndexOutOfBoundsException NegativeArraySizeException ClassCastException NoSuchFieldException ClassNotFoundException NoSuchMethodException IllegalAccessException NullPointerException 182 / 196

tab [ 1 0 ] = 100; System. o u t. p r i n t l n ( " N i e p r a w i d ł owy i n d e k s t a b l i c y! " ) ; Blok try...catch nie musi jednak obejmować tylko jednej instrukcji ani też tylko instrukcji mogących wygenerować wyjątek: System. o u t. p r i n t l n ( " D z i e s i ą t y e l e m e n t t a b l i c y : " + t a b [ 1 0 ] ) ; System. o u t. p r i n t l n ( " N i e p r a w i d ł owy i n d e k s t a b l i c y! " ) ; 183 / 196

Nie trzeba również obejmować blokiem try instrukcji bezpośrednio generujących wyjątek. Wyjątek wygenerowany przez obiekt klasy Y może być przechwytywany w klasie X, która korzysta z obiektów klasy Y. public class Tablica { p r i v a t e i n t [ ] t a b l i c a = new i n t [ 1 0 ] ; public int pobierzelement ( int indeks ) { return tablica [ indeks ] ; p u b l i c void ustawelement ( i n t indeks, i n t wartosc ) { t a b l i c a [ indeks ] = wartosc ; T a b l i c a t a b l i c a = new T a b l i c a ( ) ; t a b l i c a. ustawelement (5, 1 0 ) ; int l i c z b a = t a b l i c a. pobierzelement (10); System. o u t. p r i n t l n ( l i c z b a ) ; System. o u t. p r i n t l n ( " N i e p r a w i d ł owy i n d e k s t a b l i c y! " ) ; 184 / 196

public c l a s s Wyjatki { public void f () { g(); System. o u t. p r i n t l n ( " Wyją t e k : metoda f " ) ; public void g () { h(); System. o u t. p r i n t l n ( " Wyją t e k : metoda g " ) ; public void h () { i n t [ ] t a b = new i n t [ 0 ] ; tab [ 0 ] = 1; System. o u t. p r i n t l n ( " Wyją t e k : metoda h " ) ; W y j a t k i e x = new W y j a t k i ( ) ; ex. f ( ) ; System. o u t. p r i n t l n ( " Wyją t e k : metoda main " ) ; Które bloki try zostaną wykonane? Zasada: zostanie wykonany blok znajdujący się najbliżej instrukcji powodującej wystąpienie wyjątku. Zatem będzie to jedynie blok obejmujący wywołanie instrukcji tab[0] = 1; w metodzie h. 185 / 196

Wyjątek jest obiektem Schemat bloku try...catch instrukcje mogące spowodować wyjątek catch (TypWyjątku identyfikatorwyjątku) { obsługa wyjątku Wyjątek to obiekt powstający, kiedy w programie wystąpi sytuacja wyjątkowa. Typ wyjątku to klasa opisująca ten obiekt. Identyfikator wyjątku to zmienna obiektowa (referencyjna) wskazująca na obiekt wyjątku. 186 / 196

Wyjątek jest obiektem System. o u t. p r i n t l n ( " N i e p r a w i d ł owy i n d e k s t a b l i c y! " ) ; System. o u t. p r i n t l n ( " Komunikat systemowy : " ) ; System. o u t. p r i n t l n ( e ) ; N i e p r a w i d ł owy i n d e k s t a b l i c y! Komunikat systemowy : j a v a. l a n g. A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n : 10 187 / 196

Hierarchia wyjątków Każdy wyjątek jest obiektem pewnej klasy, które podlegają regułom dziedziczenia, np. dla wyjątku ArrayIndexOutOfBoundsException: Object -> Throwable -> Exception -> RuntimeException -> ArrayIndexOutOfBoundsException Jeśli instrukcja może wygenerować wyjątek typu X, możemy przechwycić wyjątek ogólniejszy, czyli taki, którego typem będzie jedna z klas nadrzędnych do X. c a t c h ( RuntimeException e ) { System. o u t. p r i n t l n ( " N i e p r a w i d ł owy i n d e k s t a b l i c y! " ) ; System. o u t. p r i n t l n ( " Komunikat systemowy : " ) ; System. o u t. p r i n t l n ( e ) ; Można również przechwycić wyjątek jeszcze bardziej ogólny: c a t c h ( Exception e) Jeśli instrukcje, które są obejmowane blokiem try...catch, mogą spowodować wiele różnych wyjątków, zamiast stosować wiele oddzielnych instrukcji przechwytujących konkretne typy błędów, często lepiej jest użyć jednej przechwytującej wyjątek ogólniejszy. 188 / 196

Przechwytywanie wielu wyjątków W jednym bloku try...catch można przechwytywać wiele wyjątków. Konstrukcja taka zawiera wtedy jeden blok try i wiele bloków catch. Schemat bloku try...catch instrukcje mogące spowodować wyjątek catch (KlasaWyjątku1 identyfikatorwyjątku1) { obsługa wyjątku catch (KlasaWyjątku2 identyfikatorwyjątku2) { obsługa wyjątku... catch (KlasaWyjątkuN identyfikatorwyjątkun) { obsługa wyjątku Po wygenerowaniu wyjątku następuje sprawdzenie, czy jest on klasy KlasaWyjątku1 (inaczej: czy jego typem jest KlasaWyjątku1). Jeśli tak - są wykonywane instrukcje obsługi tego wyjątku i blok try...catch jest opuszczany. Jeżeli jednak wyjątek nie jest klasy KlasaWyjątku1, następuje sprawdzenie, czy jest on klasy KlasaWyjątku2 itd. 189 / 196

Przechwytywanie wielu wyjątków Kolejność przechwytywania wyjątków nie ma znaczenia, o ile wszystkie wyjątki są na jednym poziomie hierarchii. ma znaczenie, gdy przechwytuje się wyjątki z różnych poziomów: najpierw muszą to być te bardziej szczegółowe (stojące niżej w hierarchii), potem bardziej ogólne (stojące wyżej w hierarchii). Poniższy kod zakończy się błędem catch ( RuntimeException e ) { System. o u t. p r i n t l n ( e ) ; System. o u t. p r i n t l n ( e ) ; E x c e p t i o n i n t h r e a d " main " j a v a. lang. E r r o r : Unresolved c o m p i l a t i o n problem : Unreachable catch block f o r ArrayIndexOutOfBoundsException. I t i s a l r e a d y h a n d l e d by t h e c a t c h b l o c k f o r R u n t i m e E x c e p t i o n a t Main. main ( Main. j a v a : 1 0 ) 190 / 196

catch ( RuntimeException e ) { System. o u t. p r i n t l n ( e ) ; System. o u t. p r i n t l n ( e ) ; Wyjaśnienie: Błąd bardziej ogólny zawiera już w sobie błąd bardziej szczegółowy. Jeśli przechwyci się najpierw wyjątek RuntimeException, to tak jakby przechwycić już wyjątki wszystkich klas dziedziczących po RuntimeException. Poprawiony kod: System. o u t. p r i n t l n ( e ) ; catch ( RuntimeException e ) { System. o u t. p r i n t l n ( e ) ; 191 / 196

Przechwytywanie wielu wyjątków i n t A [ ] = new i n t [ 1 0 ] ; System. o u t. p r i n t l n ( "Z ł y i n d e k s! " ) ; catch ( Exception e ){ System. o u t. p r i n t l n ( "B ł ą d og ó l n y " ) ; Zł y indeks! Pojawiło się zgłoszenie tylko pierwszego błędu. Jeśli w bloku try któraś z instrukcji spowoduje wygenerowanie wyjątku, dalsze instrukcje z tego bloku nie zostaną wykonane (blok zostaje przerwany). 192 / 196

Przechwytywanie wielu wyjątków Zmieńmy kolejność instrukcji w bloku try: i n t A [ ] = new i n t [ 1 0 ] ; System. o u t. p r i n t l n ( "Z ł y i n d e k s! " ) ; catch ( Exception e ){ System. o u t. p r i n t l n ( "B ł ą d og ó l n y " ) ; B ł ą d og ó l n y 193 / 196

Przechwytywanie wielu wyjątków W Java 7 i nowszych dostępna jest możliwość przychwycenie kilku typów wyjątków w jednym bloku catch. Poszczególne typy należy oddzielić od siebie pionową kreską. Wtedy niezależnie od tego, jaki wyjątek z wymienionych wystąpi, zostanie wykonany taki sam kod (zawarty w bloku catch). i n t A [ ] = new i n t [ 1 0 ] ; catch ( ArrayIndexOutOfBoundsException NegativeArraySizeException System. o u t. p r i n t l n ( "Z ł y i n d e k s l u b ujemny r o z m i a r t a b l i c y " ) ; catch ( Exception e ){ System. o u t. p r i n t l n ( "B ł ą d og ó l n y " ) ; e) { Z ł y i n d e k s l u b ujemny r o z m i a r t a b l i c y 194 / 196

Zagnieżdżenie bloków try...catch W jednym bloku przechwytującym wyjątek X może istnieć drugi blok, który będzie przechwytywał wyjątek Y. Schemat zagnieżdżenia instrukcje mogące spowodować wyjątek 1 instrukcje mogące spowodować wyjątek 2 catch (TypWyjątku2 identyfikatorwyjątku2) { obsługa wyjątku 2 catch (TypWyjątku1 identyfikatorwyjątku1) { obsługa wyjątku 1 195 / 196

Zagnieżdżenie bloków try...catch System. o u t. p r i n t l n ( "Z ł y i n d e k s! " ) ; i n t A [ ] = new i n t [ 1 0 ] ; catch ( Exception e ){ System. o u t. p r i n t l n ( "B ł ą d og ó l n y " ) ; Zł y indeks! B ł ą d og ó l n y 196 / 196