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

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

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

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

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

Programowanie obiektowe

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

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

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

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

Aplikacje w środowisku Java

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

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

Programowanie Obiektowe Ćwiczenie 4

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

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

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

Wyjątki (exceptions)

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

Programowanie obiektowe

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

Wykład 4: Klasy i Metody

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

Dawid Gierszewski Adam Hanasko

Programowanie obiektowe

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

Wykład 6: Dziedziczenie

Programowanie obiektowe

Metody Metody, parametry, zwracanie wartości

Podstawy i języki programowania

Klasy cd. Struktury Interfejsy Wyjątki

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Wykład 7: Pakiety i Interfejsy

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

Platformy Programistyczne Wykład z Javy dla zaawansowanych

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

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

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

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

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

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

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

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

Multimedia JAVA. Historia

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

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

Materiały do zajęć III

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Dziedziczenie. dr Jarosław Skaruz

Języki i metody programowania Java. Wykład 2 (część 2)

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

Programowanie obiektowe i zdarzeniowe

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

Dokumentacja do API Javy.

Efekty uboczne błędów

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Rozdział 4 KLASY, OBIEKTY, METODY

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

Techniki zabezpieczania kodu - kontrola wyjatków. Temat VIII

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

Programowanie obiektowe

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Tablice i łańcuchy znakowe jako obiektowe typy danych. dr Jarosław Skaruz

Podstawy programowania obiektowego

Konwencje obsługi błędów

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Aplikacje w środowisku Java

Przykład -

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

Systemy Rozproszone - Ćwiczenie 6

Programowanie w Internecie. Java

Klasy abstrakcyjne, interfejsy i polimorfizm

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

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

Programowanie obiektowe

Wykład 5 Okna MDI i SDI, dziedziczenie

Wykład 5: Więcej o Klasach i Metodach

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

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Delphi Laboratorium 3

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

Programowanie w języku Java WYKŁAD

Wykład 2: Podstawy Języka

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Java EE produkcja oprogramowania

1. Co można powiedzieć o poniższym kodzie?

Podstawy obiektowości

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Klasyfikacja wyjątków

Oracle PL/SQL. Paweł Rajba.

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

Transkrypt:

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

Wyjątki Wyjątek to sytuacja nienormalna, która pojawia się w trakcie wykonania programu. W językach bez obsługi wyjątków, błędy są wykrywane i obsługiwane ręcznie, zwykle przez kody błędów. Java dostarcza specjalnych konstrukcji językowych do sygnalizacji, wykrywania i obsługi błędów.

Wyjątki w Javie Wyjątek to obiekt, który opisuje sytuację wyjątkową (błędną) powstałą w kodzie programu: Kiedy powstaje błąd, wyjątek opisujący go jest "wyrzucany" w metodzie która ten błąd spowodowała. Metoda może "wyłapać" i "obsłużyć" wyjątek samodzielnie, lub przekazać go dalej. Błąd jest na koniec wyłapany i obsługiwany.

Konstrukcje Obsługi Wyjątków try otacza część programu, którą chcemy monitorować na wypadek sygnalizacji błędów catch w parze z try, wyłapuje określone wyjątki i obsługuje je w pewien sposób throw sygnalizuje powstanie określonego wyjątku throws określenie jakie wyjątki może dana metoda sygnalizować finally kod, który musi być koniecznie wywołany przed opuszczeniem danej metody

Blok Obsługi Wyjątków Blok try/catch/finally do obsługi dwóch rodzajów wyjątków (TypWyjatku1 i TypWyjatku2): try { //monitorowana część kodu catch(typwyjatku1 e) { //obsluga wyjatku dla typu 1 catch(typwyjatku2 e) { //obsluga wyjatku dla typu 2 finally { //kod do wykonanie przed zakonczeniem

Hierarchia Wyjątków Throwable obejmuje wszystkie wyjątki Exception wyjątki do wyłapania przez programy użytkowe RuntimeException definiowane automatycznie dla programów: dzielenie przez zero indeksowanie tablic itp. TypWyjatku wyjątki użytkownika Error nie do wyłapania przez programy użytkowe, błędy środowiska wykonawczego

Domyślna Obsługa Wyjątków class Wyjatek0 { public static void main(string args[]) { int d = 0; int a = 42 / d; Gdy system wykrywa dzielenie przez zero, tworzy nowy obiekt wyjątku, i wyrzuca go. Z braku własnej procedury obsługi, wyjątek jest przechwycony przez procedurę domyślną, która wyświetla komunikat, stos wywołań i powoduje zakończenie.

Domyślna Obsługa Wyjątków Stos wywołań: ciąg wywołań metod które prowadziły do wystąpienia błędu. class Wyjatek1 { static void metoda() { int d = 0; int a = 10 / d; public static void main(string args[]) { Wyjatek1.metoda();

Własna Obsługa Wyjątków Korzyści własnej obsługi błędów: umożliwia poprawianie błędów, zapobiega zakończeniu działania programu. class Wyjatek2 { public static void main(string args[]) { int d, a; Należy umieścić kod do monitorowania w bloku try: try { d = 0; a = 42 / d; System.out.println("Nieosiągalne");

Własna Obsługa Wyjątków Należy określić które wyjątki chcemy wyłapać: catch (ArithmeticException e) { Oraz jak te wyjątki obsłużyć: System.out.println("Dzielenie przez 0"); Kod po obsłudze wyjątku: System.out.println("Po wyjatku");

Try i Catch Bloki try i catch stanowią parę. Gdy wyrzucany jest wyjątek w bloku try: try { d = 0; a = 42 / d; System.out.println("Nieosiągalne"); kontrola przechodzi natychmiast do bloku catch: catch (ArithmeticException e) {... catch nie może wyłapać wyjątków z innych bloków try, z wyłączeniem zagnieżdżonych bloków try.

Maskowanie Błędów Wyjątek jest obsługiwany, potem program kontynuuje tak jakby nic się nie wydarzyło. Generowanie liczb losowych: import java.util.random; class ObslugaBledow { public static void main(string args[]) { int a = 0, b = 0, c = 0; Random r = new Random();

Maskowanie Błędów Obsługa błędu gdy jedna z pary liczb jest zerem: for (int i=0; i<32000; i++) { try { b = r.nextint(); c = r.nextint(); a = 12345 / (b / c); catch (ArithmeticException e) { System.out.println("Dzielenie przez 0"); a = 0; System.out.println("i: " + i + "a: " + a);

Wyświetlanie Opisu Wyjątku Klasa Throwable przesłania metodę tostring() tak by wyświetlała opis wyjątku. try {... catch (ArithmeticException e) { System.out.println("Wyjatek: " + e); a = 0;

Obsługa Kilku Wyjątków Na Raz Jeden blok try i kilka catch dla różnych wyjątków. class WieleBledow { public static void main(string args[]) { try { int a = args.length; System.out.println("a= " + a); Ryzyko dzielenia przez zero: int b = 42 / a; Indeks poza zakresem tablicy: int c[] = { 1 ; c[42] = 99;

Obsługa Kilku Wyjątków Na Raz Wyłapanie i obsługa błędu dzielenia przez zero: catch(arithmeticexception e) { System.out.println("Dzielenie przez 0"); Wyłapanie i obsługa błędu indeksowania poza tablicą: catch(arrayindexoutofboundsexception e) { System.out.println("Index poza tablica"); Kod po obsłudze błędów: System.out.println("Po obsludze bledow");

Kolejność Obsługi Wyjątków W sekwencji catch, wyjątki pod-klasy muszą wystąpić przed wyjątkami nad-klasy. Pojawi się błąd kompilacji: class WyjatekPodKlasa { public static void main(string args[]) { try { int a = 0; int b = 42 / a; catch(exception e) { System.out.println("Wyjatek generyczny"); catch(arithmeticexception e) { System.out.println("Nieosiagalny");

Zagnieżdżony Blok try Jeden blok try wewnątrz innego try. class ZagniezdzonyTry { public static void main(string args[]) { Zewnętrzny blok try: try { int a = args.length; Ryzyko dzielenia przez zero: int b = 42 / a; System.out.println("a= " + a);

Zagnieżdżony Blok try Wewnętrzny blok try: try { Ryzyko dzielenia przez zero: if (a == 1) a = a /(a-a); Wykroczenie poza zakres tablicy: if (a == 2) { int c[] = {1; c[42] = 99;

Zagnieżdżony Blok try Obsługa wyjątku wykroczenia poza zakres tablicy powstałego w bloku wewnętrznym try: catch(arrayindexoutofboundsexception e){ System.out.println("Index za tablica"); Obsługa wyjątku błędu dzielenia przez zero powstałego w bloku zewnętrznym try: catch (ArithmeticException e) { System.out.println("Dzielenie przez 0);

Zagnieżdżony Blok try wyjątek powstaje w bloku wewnętrznym try i jest obsłużony przez catch w tym samym bloku wyjątek powstaje w bloku wewnętrznym try i jest obsłużony przez catch w bloku zewnętrznym wyjątek powstaje w bloku zewnętrznym try i jest obsłużony przez catch w bloku zewnętrznym brakuje instrukcji catch w obu blokach - wyjątek obsługiwany jest przez środowisko wykonawcze

Metody i Występowanie Bloków try class MetodaZagniezdzonyTry { Metoda z wewnętrznym blokiem try: static void zagniezdzonytry(int a) { try { if (a == 1) a = a /(a-a); if (a == 2) { int c[] = {1; c[42] = 99; catch (ArrayIndexOutOfBoundsException e) { System.out.println("Index poza tablica);

Metody i Występowanie Bloków try Metoda z zewnętrznym blokiem try: public static void main(string args[]) { try { int a = args.length; int b = 42 / a; System.out.println("a= " + a); zagniezdzonytry(a); catch (ArithmeticException e) { System.out.println("Dzielenie przez 0);

Wyrzucanie Wyjątków Program użytkownika może sam wyrzucać wyjątki: throw object; Obiekt musi być klasy Throwable, albo jej pod-klasy. Uzyskanie obiektu klasy Throwable: użycie operatora new użycie parametru w instrukcji catch

Obsługa throw Przerwanie wykonania na instrukcji throw: czy najbliższy otaczający blok try posiada instrukcję catch dla obsługi danego wyjątku? w przeciwnym razie, czy kolejny otaczający blok try posiada tą instrukcję? w przeciwnym razie, wykonaj domyślną obsługę wyjątku: przerwanie wykonania, drukowanie stosu

Demonstracja throw class ThrowDemo { static void metoda() { try { Tworzy nowy wyjątek i go wyrzuca: throw new NullPointerException("demo"); Wyjątek jest wyłapany natychmiast: catch(nullpointerexception e) { System.out.println("Zlapany w metodzie");

Demonstracja throw Obsługa polega na przesłaniu wyjątku dalej: throw e; Wyjątek jest złapany ponownie przez metodę main: public static void main(string args[]) { try { metoda(); catch(nullpointerexception e) { System.out.println("Zlapany ponownie");

Tworzenie Standardowych Wyjątków Tworzenie obiektu standardowej klasy wyjątku: throw new NullPointerException("demo"); Wszystkie standardowe wyjątki mają dwa konstruktory: bezparametrowy z parametrem String opisującym wyjątek; dostępny przez getmessage() w Throwable

Deklaracja throws Jeśli metoda może spowodować wyjątek którego sama nie jest w stanie obsłużyć, to musi ten fakt opisać. typ nazwa(parametry) throws wyjatki {... Niezbędne jest wymienienie wszystkich wyjątków, oprócz typów Error i RuntimeException.

Brak Deklaracji throws Metoda wyrzuca wyjątek którego ani nie wyłapuje, ani nie deklaruje. Ten program nie kompiluje się. class ThrowsDemo1 { static void metoda() { System.out.println("Wewnatrz metody"); throw new IllegalAccessException("demo"); public static void main(string args[]) { metoda();

Dodana Deklaracja throws Jedna metoda deklaruje, druga wyłapuje wyjątek: class ThrowsDemo2 { static void metoda() throws IllegalAccessException { System.out.println("Wewnatrz metody"); throw new IllegalAccessException("demo"); public static void main(string args[]) { try { metoda(); catch (IllegalAccessException e) { System.out.println("Zlapany " + e);

Deklaracja finally Kod który będzie wykonany po bloku try/catch, bez względu na powstanie wyjątków. Użyteczny gdy należy zwolnić zasoby systemowe. Każdy try musi posiadać co najmniej jedną instrukcję catch lub finally.

Demonstracja finally class FinallyDemo { static void proca() { try { System.out.println("wewnatrz proca"); throw new RuntimeException("demo"); finally { System.out.println("procA: finally"); static void procb() { try { System.out.println("wewnatrz procb"); return; finally { System.out.println("procB: finally");

Demonstracja finally static void procc() { try { System.out.println("wewnatrz procc"); finally { System.out.println("procC: finally"); public static void main(string args[]) { try { proca(); catch(exception e) { System.out.println("Wyjatek zlapany"); procb(); procc();

Standardowe Wyjątki Niesprawdzane RuntimeException są dostępne automatycznie. Nie muszą być deklarowane w sekcji throws. Kompilator nie sprawdza czy metoda deklaruje czy obsługuje te wyjątki. Inaczej wyjątki niesprawdzane.

Standardowe Wyjątki Niesprawdzane ArithmeticException błędy arytmetyczne, np. dzielenie przez zero ArrayIndexOutOfBoundsException indeks tablicy poza zakresem ArrayStoreException przypisanie tablicy nieodpowiedniego typu elementu ClassCastException niepoprawne rzutowanie IllegalArgumentException niepoprawny argument metody IllegalMonitorStateException niepoprawna operacja monitora

Standardowe Wyjątki Niesprawdzane IllegalStateException środowisko lub aplikacja jest w niepoprawnym stanie IllegalThreadStateException wymagana operacja niekompatybilna z bieżącym stanem wątka IndexOutOfBoundException jakis rodzaj indeksu jest poza zakresem NegativeArraySizeException tablica tworzona z ujemnym rozmiarem NullPointerException niepoprawne użycie wskaźnika null

Standardowe Wyjątki Niesprawdzane NumberFormatException niepoprawna konwersja stringu na format liczbowy SecurityException próba naruszenia bezpieczeństwa StringIndexOutOfBoundsException indeks poza zakresem stringu UnsupportedOperationException napotkano niepoprawną operację

Standardowe Wyjątki Sprawdzane Metody która mogą generować te wyjątki a nie potrafią ich samodzielnie obsłużyć, muszą je deklarować: ClassNotFoundException nie znaleziono klasy CloneNotSupportedException próba klonowania obiektu który nie implementuje interfejsu Cloneable. IllegalAccessException dostęp do klasy zabroniony InstantiationException próba tworzenia obiektu klasy abstrakcyjnej lub interfejsu

Standardowe Wyjątki Sprawdzane InterruptedException jeden wątek przerwany przed drugi NoSuchFieldException pole nie istnieje NoSuchMethodException metoda nie istnieje

Tworzenie Własnych Klas Wyjątków Utwórz pod-klasę Exception. Pod-klasa nie musi nic deklarować, musi tylko istnieć. Exception nie deklaruje własnych metod, ale dziedziczy po Throwable.

Demonstracja Własnych Klas Wyjątków Własna klasa wyjątków: class MojWyjatek extends Exception { private int szczegoly; MojWyjatek(int a) { szczegoly = a; Przesłonięcie metody z klasy Throwable: public String tostring() { return "MojWyjatek[" + szczegoly + "]";

Demonstracja Własnych Klas Wyjątków class MojeWyjatki { Metoda deklaruje wyjątek tej klasy: static void oblicz(int a) throws MojWyjatek { System.out.println("oblicz(" + a + ")"); Wyrzucenie wyjątku: if (a > 10) throw new MojWyjatek(a); System.out.println("Normalne wyjscie");

Demonstracja Własnych Klas Wyjątków public static void main(string args[]) { try { oblicz(1); oblicz(20); Przechwycenie wyjątku: catch (MojWyjatek e) { System.out.println("Zlapany " + e);