Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie obiektowe w Javie. Klasy i obiekty.

Podobne prezentacje


Prezentacja na temat: "Programowanie obiektowe w Javie. Klasy i obiekty."— Zapis prezentacji:

1 Programowanie obiektowe w Javie

2 Klasy i obiekty

3 Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) paradygmat programowania, w którym programy definiuje się za pomocą obiektów elementów łączących stan (czyli dane, nazywane najczęściej polami) i zachowanie (czyli procedury, tu: metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań.

4 Cechy obiektowego języka programowania Dziedziczenie - polega na przypisywaniu tworzonej klasie wszystkich cech i zachowań klasy istniejącej Abstrakcja - każdy obiekt w systemie służy jako model abstrakcyjnego "wykonawcy", który może wykonywać pracę, opisywać i zmieniać swój stan, oraz komunikować się z innymi obiektami w systemie, bez ujawniania, w jaki sposób zaprogramowano dane cechy

5 Cechy obiektowego języka programowania Polimorfizm (wielopostaciowość) – dla jednej metody określonej przez wspólny nagłówek istnieje wiele postaci treści tej metody Enkapsulacja (hermetyzacja) - zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób

6 Klasa Klasa - abstrakcyjny byt określający zbiór obiektów o takich samych właściwościach. Klasa definiuje zestaw pól i metod dla swoich obiektów. Przykładem klasy może być samochód. Może on podejmować różne działania np. jechać i ma pewne właściwości np. kolor. Jest jednak abstrakcyjny, mówiąc inaczej "nienamacalny". Jeżeli mówimy o klasie Samochód to oznacza, że mówimy o jakimś samochodzie.

7 Definicja klasy przyjmuje następującą formę: [modyfikatory] class NazwaKlasy [extends NazwaNadklasy] [implements NazwyInterfejsów] { // Ciało klasy: // Tutaj znajdują się definicje pól danych, metod // i klas wewnętrznych klasy }

8 Przykładowe modyfikatory klas Abstract Final Public Protected Private Static

9 Definicja pola klasy przyjmuje następującą formę: modyfikatoryPola TypPola NazwaPola; Gdzie: modyfikatoryPola określają tryb dostępu (np. private) i właściwości pola (np. pole statyczne) TypPola specyfikuje typ pola danych; NazwaPola określa nazwę deklarowanego pola.

10 Definicja metody przyjmuje następującą formę: modyfikatory TypRezultatu NazwaMetody(ListaParametrów) { //treść metody } Gdzie: modyfikatory określają tryb dostępu i właściwości metody TypRezultatu określa typ wyniku metody NazwaMetody która musi być poprawnym identyfikatorem Javy ListaParametrów lista argumentów przekazywanych do metody

11 Przykładowa klasa class Osoba { String imie; int wiek; String imie(){ return imie; } void wiek(){ System.out.println("Masz " + wiek+ " lat"); } }

12 Przeciążanie metod Możemy przeciążać (ang. function overloading) nazwę metody, tzn. możemy stosować tę samą nazwę dla różnych metod, byleby tylko różniły się one między sobą liczbą lub rodzajem argumentów lub były metodami różnych klas.

13 Przykład void MojaMetoda() {... } void MojaMetoda(int i, String s) {... } void MojaMetoda(String s) {... }

14 Konstruktor metoda klasy wykonywana w momencie inicjalizacji obiektu tej klasy musi posiadać nazwę identyczną z nazwą klasy nie posiada typu zwracanego jeśli sami nie zdefiniujemy żadnego konstruktora, to kompilator sam wygeneruje bezargumentowy konstruktor domyślny

15 Przykład konstruktora class Osoba { String imie; String nazwisko; Osoba(String imie, String nazwisko){ this.imie = imie; this.nazwisko = nazwisko; } Osoba() {this.imie = "nieznane"; this.nazwisko = "nieznane";} }

16 Przykład konstruktora kopiującego class Osoba { String imie; String nazwisko; Osoba(Osoba os) { this.imie = os.imie; this.nazwisko = os.nazwisko; }

17 Finalizator W niektórych językach z wbudowanym odśmiecaczem (np. Java i C#) dostępna jest składnia finalizatora - specjalnej metody wywoływanej, gdy obiekt jest usuwany przy odśmiecaniu. W przeciwieństwie do destruktora nie wiadomo, w którym dokładnie momencie działania programu to nastąpi. Dodatkowo np. w Javie nie ma pewności czy metoda finalize() w ogóle zostanie wywołana.

18 Obiekt Obiekt - byt fizyczny stanowiący instancję klasy. O obiektach możemy myśleć jak o egzemplarzach określonych klas. Jeżeli mówimy o obiekcie samochód będącym instancją klasy Samochód to oznacza, że mówimy o konkretnym samochodzie.

19 Deklaracja zmiennej typu obiektowego: NazwaTypu NazwaZmiennej [ = WartośćPoczątkowa ]; Przykład: Osoba os = new Osoba();

20 Notacja kropkowa Dostęp do atrybutów obiektu, reprezentowanych przez zmienną obiektową, realizujemy za pomocą wyrażeń kropkowych postaci: NazwaZmiennejObiektowej.NazwaAtrybutu; Przykład: os.imie = Jan;

21 Czy wszystko w Javie jest obiektem? Niemal wszystkie dane w Javie (poza kilkoma typami prostymi) traktowane są jako obiekty. Warto zaznaczyć, że od wersji 1.5 Java oferuje mechanizm "pudełkowania" (autoboxing) dla typów prostych. Wszelkie typy proste są w procesie kompilacji zamieniane na odpowiadające im obiekty. Mechanizm zamieniający kompilatora dba jednak o to, żeby skompilowany kod zachował zgodność wstecz. Obiekty odpowiadające typom prostym mogą zostać "wypakowane" (unboxing) do typu prostego.

22 Klasy osłonowe Boolean – boolean Character – char Integer – int Double – double Float – float Byte – byte Short – short Long – long

23 Modyfikatory dostępu: public, private, package

24 Modyfikatory dostępu: public, private, protected, package Cztery poziomy dostępu: Public Protected Default Private

25 Modyfikatory dostępu Można stosować do: Klas Atrybutów Metod

26 Modyfikatory dostępu: public Źródło wywołaniaDostęp Ta sama klasaTak Klasa dziedzicząca w tym samym pakiecie Tak Klasa niedziedzicząca w tym samym pakiecie Tak Klasa dziedzicząca w innym pakiecie Tak Klasa niedziedzicząca w innym pakiecie Tak

27 Modyfikatory dostępu: default Źródło wywołaniaDostęp Ta sama klasaTak Klasa dziedzicząca w tym samym pakiecie Tak Klasa niedziedzicząca w tym samym pakiecie Tak Klasa dziedzicząca w innym pakiecie Nie Klasa niedziedzicząca w innym pakiecie Nie

28 Modyfikatory dostępu: private Źródło wywołaniaDostęp Ta sama klasaTak Klasa dziedzicząca w tym samym pakiecie Nie Klasa niedziedzicząca w tym samym pakiecie Nie Klasa dziedzicząca w innym pakiecie Nie Klasa niedziedzicząca w innym pakiecie Nie

29 Modyfikatory dostępu: protected Źródło wywołaniaDostęp Ta sama klasaTak Klasa dziedzicząca w tym samym pakiecie Tak Klasa niedziedzicząca w tym samym pakiecie Tak Klasa dziedzicząca w innym pakiecie Tak Klasa niedziedzicząca w innym pakiecie Nie

30 Modyfikatory dostępu: protected PrivateDefaultProtectedPublic Ta sama klasaTak Klasa dziedzicząca w tym samym pakiecie Tak Klasa niedziedzicząca w tym samym pakiecie Tak Klasa dziedzicząca w innym pakiecie Tak Klasa niedziedzicząca w innym pakiecie Nie

31 Dziedziczenie, polimorfizm, hermetyzacja i klasy wewnętrzne

32 Dziedziczenie Dziedziczenie polega na przejęciu właściwości i funkcjonalności obiektów innej klasy i ewentualnej modyfikacji tych właściwości i funkcjonalności w taki sposób, by były one bardziej wyspecjalizowane. Dziedziczenie pozwala na zmniejszanie nakładów na kodowanie (reusing).

33 Dziedziczenie w Javie W Javie można dziedziczyć zarówno po klasach jak i po interfejsach. Oba te sposoby dziedziczenia są w Javie odmiennie wyrażane składniowo. Przy dziedziczeniu po klasach używa się słowa kluczowego extends, zaś przy dziedziczeniu po interfejsach słowa implements. Stąd często zamiast mówić o dziedziczeniu mówi się w Javie o rozszerzaniu klas lub implementowaniu interfejsów. Ponadto w Javie dziedziczenie po klasach jest ograniczone do tylko jednej bezpośredniej nadklasy (nie ma w Javie wielodziedziczenia takiego jak np. w C++), można natomiast dziedziczyć (bezpośrednio) po dowolnej liczbie interfejsów.

34 Przykłady // dziedziczenie po klasie class Pracownik extends Osoba{} // dziedziczenie po kilku interfesjach class Samochód implements Pojazd, Towar{} // dziedziczenie po klasie i kilku interfejsach class Chomik extends Ssak implements Puchate, DoGłaskania{}

35 Przykłady cd. class Pracownik{ String imie; String nazwisko; int wyplata; public Pracownik(String i, String n, int w){ imie = i; nazwisko = n; wyplata = w; } class Szef extends Pracownik{ int premia; }

36 Uwaga Jeśli klauzula extends jest pominięta, to domyślnie przyjmuje się, że klasa dziedziczy po klasie Object. Co za tym idzie każda klasa pośrednio lub bezpośrednio dziedziczy z klasy Object. Taki zapis: class Pracownik{} Jest równoznaczny z poniższym: class Pracownik extends Object{}

37 Dziedziczenie interfejsu Podobnie jak klasy, tak i interfejsy mogą podlegać dziedziczeniu. Jednak dziedziczenie interfejsów jest bardziej rozbudowane, a mianowicie w procesie tym nie występuje ograniczenie co do jednokrotnego dziedziczenia. Interfejs może więc dziedziczyć po większej liczbie interfejsów.

38 Przykład interface Interfejs1 { void metoda1(int i); } interface Interfejs2 { void metoda2(int i); } interface Interfejs3 extends Interfejs1, Interfejs2 { void metoda3(int i); }

39 Przesłanianie metod Przesłanianie metod polega na tym że metoda podklasy ma tą samą nazwę i typ jak metoda nadklasy, wtedy mówimy że przesłania ją. Wersja metody dla nadklasy zostaje ukryta. Jeżeli z podklasy chcemy wywołać przesłoniętą metodę z nadklasy musimy poprzedzić ją przedrostkiem super.

40 Przesłanianie metod – wymagane warunki typy wyników tych metod muszą być takie same lub kowariantne (co oznacza m.in., że typ wyniku metody z podklasy może być podtypem wyniku metody nadklasy) przedefiniowanie nie może ograniczać dostępu tzn. specyfikator dostępu metody przedefiniowanej w podklasie musi być taki sam lub szerszy (np. public zamiast protected) niż metody przedefiniowywanej metoda przedefiniowana (z podklasy) nie może zgłaszać więcej lub bardziej ogólnych wyjątków kontrolowanych niż metoda przedefiniowywana (z nadklasy)

41 Override Przedefiniowując metody w podklasach warto używać Daje ona sygnał kompilatorowi, że intencją programisty jest przedefiniowanie metody. Na przykład, programista chce przedefiniować metodę getPreferredSize() z klasy Component w jakiejś jej podklasie, ale pomylił się w pisowni i zapisał metodę getPrefferedSize(). Nie ma błędu - to jest po prostu całkiem nowa metoda. Metoda getPreferredSize() używana jest przy wyznaczaniu preferowanych rozmiarów komponentu - programista chciał przedefiniować jej działanie z nadklasy. Program się skompiluje i będzie działał, ale kod metody napisanej przez programistę nie będzie wykonywany i trudno będzie dociec błędu. Jeśli użyjemy kompilator wykryje błąd i poinformuje o nim.

42 Przesłonięcie metody - przykład class Pracownik{ String imie; String nazwisko; int wyplata; public void Zarabiam(){ System.out.println("Zarabiam " + wyplata); } class Szef extends Pracownik{ int public void Zarabiam(){ super.Zarabiam(); System.out.println("Dostaję premię " + premia); }

43 Metody finalne Ponieważ w Javie wszystkie metody są domyślnie wirtualne, implementacja każdej z nich może zostać podana lub zmieniona w klasach pochodnych. W celu zablokowania takiej możliwości należy metodę zadeklarować jako finalną. Oznacza to, że nie może ona zostać zaimplementowana w klasie pochodnej, a jej implementacja musi zostać podana w klasie w której została zadeklarowana. Przykład: public class Przyklad{ public final void metodaFinalna(){...} }

44 Klasy finalne Zadeklarowanie klasy jako finalnej oznacza, że nie może być ona dziedziczona przez inne klasy co może być podyktowane względami bezpieczeństwa lub efektywności. Wiele standardowych klas Javy jest klasami finalnymi np.: java.lang.System i java.lang.String. Wszystkie metody w klasie finalnej są automatycznie finalne. Np. klasa String jest definiowana jako: public final class String {... }

45 Polimorfizm (wielopostaciowość) Technika programowania obiektowego pozwalająca na tworzenie w hierarchiach klas wielu funkcji (metod) o takiej samej nazwie, ale różniących się implementacjami. W różnych klasach hierarchii może występować inna wersja takiej funkcji, która jest dostosowana do konkretnych potrzeb danego typu.

46 Przykład class Zwierze{ void DajGlos() { System.out.println("Zwierze"); } } class Pies extends Zwierze{ void DajGlos() { System.out.println("Pies"); } }

47 Przykład cd. //wnętrze funkcji main Zwierze z = new Zwierze(); Pies p = new Pies(); z.DajGlos(); //wypisze "Zwierze" p.DajGlos(); //wypisze "Pies" z = p; z.DajGlos(); //wypisze "Pies"

49 Klasy wewnętrzne Klasa wewnętrzna lub zagnieżdżona to klasa, która jest zdefiniowana wewnątrz innej klasy. Klasy wewnętrzne posiadają dostęp do metod statycznych klasy głównej, lecz nie muszą być instancjonowane wraz z nią.

50 Przykład class A { class B { } }

51 Hermetyzacja Hermetyzacja (enkapsulacja) – polega na ukrywaniu pewnych danych składowych lub metod obiektów danej klasy tak, aby były one dostępne tylko metodom wewnętrznym danej klasy lub funkcjom zaprzyjaźnionym. Gdy dostęp do wszystkich pól danej klasy jest możliwy wyłącznie poprzez metody, lub inaczej mówiąc: gdy wszystkie pola w klasie znajdują się w sekcji prywatnej lub chronionej, to taką hermetyzację nazywa się hermetyzacją pełną.

52 Trzy główne zalety hermetyzacji: uodparnia tworzony model na błędy lepiej oddaje rzeczywistość umożliwia rozbicie modelu na mniejsze elementy Hermetyzacja

53 Przykład public class Foo { private int value = 666; public void setValue(int newValue) { value = newValue; } public int getValue() { return value; } }

54 Klasy abstrakcyjne i interfejsy

55 interface Instrument{ void play(); } abstract class AbstractInstrument implements Instrument{ String sound; AbstractInstrument(String sound){this.sound=sound;} void play(){ System.out.print(sound); } class Trabka extends AbstractInstrument{ Trabka(){super("tururu");} }

56 Klasy abstrakcyjne i interfejsy Klasa abstrakcyjna: Nie da się utworzyć instancji Może zawierać metody abstrakcyjne Może zawierać metody Może zawierać atrybuty Może zawierać konstruktory Może zawierać klasy

57 Klasy abstrakcyjne i interfejsy Interface: Nie da się utworzyć instancji Może zawierać deklaracje metod Może zawierać stałe Może zawierać klasy

58 Klasy abstrakcyjne i interfejsy Interface – dziedziczenie wielokrotne Klasy – dziedziczenie pojedyncze

59 Typ wyliczeniowy Enum

60 Wyliczenie (ang. enumeration), zwane także typem wyliczeniowym, jest zbiorem symbolicznych stałych całkowitych określających wszystkie dopuszczalne wartości, jakie może przyjąć dana zmienna. Wyliczenia są częstym elementem programów. Typ wyliczeniowy definiuje się za pomocą słowa kluczowego enum, umieszczanego na początku instrukcji. Ogólną postać: enum {lista_wyliczenia} ;

61 Nazwa wyliczenia i zmienne typu wyliczeniowego Zarówno nazwa_wyliczenia wyliczenia, jak i lista_zmiennych są opcjonalne, ale nie można ich pominąć jednocześnie. Podobnie jak w przypadku struktur, nazwa wyliczenia umożliwia deklarowanie zmiennych tego typu.

62 Nazwa wyliczenia i zmienne typu wyliczeniowego public enum Czlonkowie { JAREK, JUREK, FILIP }; public Czlonkowie wybranyCzlonekZespolu; … If (wybranyCzlonekZespolu == Czlonkowie.JAREK) { // adresowane do Jarka }

63 Typ enum jest typem wyliczeniowym, literałem, który jest traktowany jak klasa specjalna zawierająca w swojej definicji wszystkie możliwe do stworzenia instancje, obiekty. enum Stany{ A, B}

64 enum Wartosci { A, B; public String name; protected String value; private int number; } Enum pola i metody - pola

65 static values() - zwraca tablicę zawierającą wszystkie obiekty enum. W naszym przypadku będą to A i B static valueOf(String) - zwraca wartość enuma, w postaci obiektu enum, dla klucza określonego jako String static valueOf(Class, String) - zwraca wartość enuma, w postaci obiektu enum, dla klucza określonego jako String z klasy enumów T. Metody własne enum

66 enum Wartosci { A, B("enum B"); //... public void metoda1(){ //... } protected void metoda2(){ //... } private void metoda3(){ //... } private Wartosci(){ //... } private Wartosci(String s){ name = s; } Definiowanie metod

67 Enum w pętlach i przełącznikach (switch) void metoda1(){ metoda(Wartosci.A); } void metoda(Wartosci w){ switch (w) { case A: break; case B: break; } ==.equals()

68 Enum w pętlach i przełącznikach (pętle) for(Wartosci w : Wartosci.values()){ System.out.println(w.value); }

69 Stałe w Javie

70 Słowo kluczowe final: Przypisanie możliwe tylko raz Zmienne prymitywne prawdziwie stałe Zmienne obiektowe stałe jedynie, gdy zapewniono programistycznie

71 Pola i metody statyczne

72 Słowo kluczowe static: Przynależność do klasy, nie do obiektu Współdzielenie między wszystkimi instancjami Inicjalizacja podczas załadowania klas Brak polimorfizmu w metodach

73 Dokumentacja klas w javadoc

74 Wprowadzenie do Javadoc o standardowe narzędzie do tworzenia dokumentacji API dla Javy o powstał w firmie Sun Microsystems jako część pakietu do tworzenia aplikacji Java 2 SDK o służy tylko do dokumentowania programów napisanych w Javie o generuje dokumentację z kodu źródłowego do formatu html

75 Co wygeneruje Javadoc? o listę wszystkich pakietów w projekcie wraz z listą klas w każdym pakiecie o hierarchię klas oraz zależności między klasami o opis klasy, pakietu, projektu o informacje o przestarzałych metodach (deprecated) o alfabetyczny indeks klas, interfejsów, konstruktorów, pól i metod

76 Przykład wygenerowanej dokumentacji

77

78 Zasady działania Javadoc o bazuje na kompilatorze Javy o używa specjalnych znaczników umieszczonych w komentarzach do generowania dokumentacji o używa tzw. docletów do generowania plików wyjściowych (do określenia formatu wyjściowego)

79 Doclety o programy napisane w Javie z własnym API określają zawartość i format pliku wyjściowego, wygenerowanego przez Javadoc o aby użyć niestandardowego docletu: javadoc -doclet JP.co.esm.caddies.doclets.UMLDoclet -private *.java (UMLDoclet, generuje strony HTML zawierające diagramy klas w standardzie UML)

80 Doclety o szkielet docletu: o klasa RootDoc przechowuje informacje z jednego uruchomienia o Javadoc (pakiety, klasy i opcje określone przez użytkownika) pliki z klasami API docletu są w pliku lib/tools.jar. Po kompilacji tools.jar musi być w ścieżce klasowej. można do tego celu użyć opcji -classpath z Javadoc.

81 Zalety Javadoc dokumentacja zintegrowana z kodem źródłowym

82 Wady Javadoc o Javadoc nie wspiera innych języków niż Java o nie umożliwia dokumentowania treści metod o generuje dokumentację tylko w formacie html

83 Znaczniki Javadoc nazwaParametru opis znacznik opisujący parametr klasy lub metody. W opisie powinien znaleźć się typ parametru. opis znacznik opisujący wartość zwracaną przez metodę. Opis powinien zawierać typ zwracanego wyniku oraz zakres zwracanych wartości. wyjątek opis znacznik opsujący wyjątek, jaki może rzucić metoda. nazwa Informuje kto jest autorem kodu. Powinno być stosowane jedynie w opisie klas i interfejsów.

84 Znaczniki Javadoc textWersji znacznik informujący, do której wersji oprogramowania należy ta części kodu. textWersji znacznik informujący, w której wersji oprogramowania została dodana opisywana część kodu. odnosnik odnośnik do innych materiałów. Dopuszczalne są trzy napis nie tworzy linku. Wyświetla tylko etykieta tworzy link do strony podanej jako pakiet.klasa#element etykieta najbardziej popularna forma. Tworzy odnośnik wewnątrz projektu do elementu klasy (metoda, pole).

85 Znaczniki Javadoc opis znacznik informujący, że dana część kodu jest przestarzała i nie powinna być wykorzystywana. W opisie powinna wystąpić informacja od której wersji kod jest przestarzały oraz czym należy go zastąpić. o pakiet.klasa#element etykieta} znacznik, który może wystąpić wewnątrz innego. Tworzy on odnośnik do elementu klasy i jest opatrzony etykietą.

86 Znaczniki Javadoc Gdzie jaki można stosować? Znaczniki dokumentacji pakietu: o o o

87 Znaczniki Javadoc Gdzie jaki można stosować? Znaczniki dokumentacji klasy i interfejsu: o o o

88 Znaczniki Javadoc Gdzie jaki można stosować? Znaczniki dokumentacji pola: o o o o

89 Znaczniki Javadoc Gdzie jaki można stosować? Znaczniki dokumentacji metod i konstruktorów o o o o

90 Znaczniki Javadoc Gdzie jaki można stosować? Znaczniki dokumentacji metod i konstruktorów o o o o

91 Trzy rodzaje dokumentacji: W komentarzach wystepuja trzy rodzaje dokumentacji: dokumentacja klasy, dokumentacja metody, dokumentacja zmiennej (pola) o Należy pamiętać, ze standardowo zostaną opisane tylko składowe klas oznaczane jako public i protected.

92 Jak korzystać z Javadoc?

93 Javadoc w Eclipse szkielet komentarza można modyfikować: Window->Preferences->Java->Code Style->Code Templates. Eclipse umożliwia w łatwy sposób generowanie dokumentacji: menu Project -> Generate Javadoc

94 Uruchamianie Javadoc o wyświetlenie instrukcji obsługi javadoc: javadoc lub javadoc -help o generowanie dokumentacji: javadoc [opcje] nazwa_pakietu lub javadoc [opcje] nazwa_pliku.java

95 Wyjątki w Javie

96 Wyjątki o Java posiada zapożyczony z języka Ada mechanizm informowania o błędach: wyjątki (ang. exceptions). o Mechanizm obsługi wyjątków w Javie umożliwia obsługę sytuacji krytycznych, dzięki czemu program nie zawiesi się po wystąpieniu błędu i wykona ciąg operacji obsługujących dany wyjątek. o Mechanizm obsługi wyjątków zwiększa niezawodność programów Java.

97 Wyjątki try { // zrób coś ryzykownego } catch (Exception ex) { // spróbuj rozwiązać problem }

98 Wyjątki o wyjątki kontrolowane (ang. checked exeptions) – stanowią większość wyjątków w Javie. Znaczy to, że kompilator jest w stanie sprawić, że każda metoda zgłasza tylko te wyjątki, które są jawnie wymienione w jej deklaracji. o wyjątki niekontrolowane (ang. unchecked exeptions) – standardowe wyjątki i błędy zgłaszane przez system wykonawczy, które są podklasami klas RuntimeExeption i Error.

99 Wyjątki klasy RuntimeException Kompilator sprawdza wszystkie wyjątki za wyjątkiem wyjątków klasy RuntimeException RunTimeExceptions jest to szczególna podklasa klasy Exception. Obsługuje ona wyjątki, które występują podczas wykonywania programu. Występują one np. wtedy, gdy zostaną wyczerpane zasoby systemowe lub nastąpi odwołanie do nie istniejącego elementu tablicy lub pliku.

100 Wyjątki o Programista sam może decydować czy w danym momencie ma być wyrzucany wyjątek czy nie. o Zasada: wyjątek jest wtedy gdy w danym momencie przetwarzania danych nie mamy wystarczająco wiedzy aby poradzić sobie z powstałym problemem.

101 Użyteczne metody klasy Throwable o String getMessage() - zwraca napis podany kontruktorowi wyjątku Exception. o String toString() - zwraca napis reprezentujący nazwę wyjątku (klasy wyjątku). o void printStackTrace() - wypisuje call stack trace czyli sekwencję metod, która została wywołana do momentu wyrzucenia wyjątku.

102 Deklarowanie typów wyjątków o Do opisu sytuacji wyjątkowych wygodnie jest mieć więcej danych niż tylko napis, który udostępnia klasa Exception. W razie potrzeby, możemy utworzyć podklasę klasy Exception, która będzie zawierała niezbędne dodatkowe dane. o Przeanalizujmy sytuację dot. aplikacji Egzamin, w której będziemy potrzebowali zgłosić przykładowy wyjątek NieZdalEgzaminu. Zgłaszany wyjątek powinien zawierać informację: kto nie zdał egzaminu i z jakiego przedmiotu.

103 Deklarowanie typów wyjątków public class NieZdalEgzaminu extends Exeption{ public Student student; public String przedmiot; NieZdalEgzaminu(Student nieprzygotowany, String nazwaPrzedmiotu){ super("Student " + nieprzygotowany.nazwisko+ "nie zdal " + przedm); student=nieprzygotowany; przedmiot=nazwaPrzedmiotu; }

104 Wykorzystanie instrukcji throw i klauzuli throws (1) o Instrukcja throw – służy do zgłaszania wyjątków. Wymaga podania obiektu reprezentującego wątek. o Klauzula throws – w jej treści opisywane są wyjątki kontrolowane przez daną metodę (lista nazw oddzielonych przecinkami). nazwaMetody(zmienne) throws Wyjątek1, Wyjątek2 { instrukcje;... throw Wyjatek1;... }

105 Wykorzystanie instrukcji throw i klauzuli throws (2) public void przeprowadzEgzamin(Student student, String przedmiot) throws NieZdalEgzaminu {... //instrukcje... if(student.ocena==2) throw NieZdalEgzaminu(student, przedmiot); else student.wpiszDoIndexu(przedmiot, student.ocena); }

106 Wykorzystanie instrukcji try oraz klauzul catch i finally (1) Wyjątki można wychwytywać za pomocą instrukcji try. Składnia bloku try jest następująca: try //instrukcje catch(typ_wyjatku id) //instrukcje catch(typ_wyjatku id) //instrukcje... finally //instrukcje

107 Wykorzystanie instrukcji try oraz klauzul catch i finally (2) o Instrukcje umieszczone w sekcji try są wykonywane do chwili zgłoszenia wyjątku. o Jeśli zostanie zgłoszony wyjątek, to będą przeszukane kolejne klauzule catch w celu znalezienia klasy (lub superklasy) zgłoszonego wyjątku. o Jeżeli klasy wyjątku nie uda się znaleźć, to wyjątek jest propagowany na zewnątrz instrukcji try. o Fakultatywna klauzula finally będzie zawsze wykonana po wszystkich czynnościach związanych z obsługą klauzul catch.

108 Wykorzystanie instrukcji try oraz klauzul catch i finally (3) try{ przeprowadzEgzamin(ProgramowanieJava); } catch(NieZdalEgzaminu e){ System.out.println("Niestety, tym razem nie udało się."); } finally{ System.out.println("Dziękuję za interesującą wymianę zdań!"); }

109 Tworzenie własnych wyjątków class Lapsus extends Exception{...} public class Test{ public void zaplanowaneDzialania() throws Lapsus{ //spodziewamy się powodzenia, ale... throw new Lapsus(); } public static void main(String[] args){ Test t = new Test(); try{ t.zaplanowaneDzialania(); } catch(Lapsus e){ System.err.println(Przechwycony błąd!); e.printStackTrace(); }

110 Kiedy używać wyjątków? o Wybór sytuacji, w których należy zgłosić wyjątek, nie podlega żadnym sztywnym regułom. o Należy jednak pamiętać o tym, aby nie nadużywać wyjątków jako metody zgłaszania sytuacji normalnych i oczekiwanych.


Pobierz ppt "Programowanie obiektowe w Javie. Klasy i obiekty."

Podobne prezentacje


Reklamy Google