J¦zyk programowania JAVA
c© 2011-12 Radosªaw Klimek
Vincent Van GOGH: M¦»czyzna pij¡cy �li»ank¦ kawy
Radosªaw Klimek J¦zyk programowania Java
W¡tki
Proces to wykonuj¡cy si¦ program wraz z dynamicznieprzydzielanymi mu przez system zasobami (np. pami¦ci¡operacyjn¡, zasobami plikowymi). Ka»dy proces ma wªasn¡przestrze« adresow¡.W¡tek to sekwencja dziaªa«, która wykonuje si¦ w kontek±ciedanego procesu (programu)Ka»dy proces ma co najmniej jeden wykonuj¡cy si¦ w¡tek. Wsystemach wielow¡tkowych proces mo»e wykonywa¢ równolegle(teoretycznie) wiele w¡tków, które wykonuj¡ si¦ w jednej przestrzeniadresowej procesu.
Radosªaw Klimek J¦zyk programowania Java
Programowanie wielow¡tkowe
Cech¡ charakterystyczn¡ programowania wielow¡tkowego jestto, »e tworzone programy dzieli si¦ na wieksz¡ liczb¦ procesów,które mog¡ by¢ wykonywane równocze±nie. Wiele zada«wyst¦puj¡cych w interakcyjnych programach jest wykonywanychwspóªbie»nie. Zadania, które mog¡ by¢ wykonywane wspóªbie»nieto np:
odczytywanie i zapisywanie plików
korzystanie z zasobów sieciowych
reagowanie na dane wprowadzane przez u»ytkownika
wykonywanie skomplikowanych trwaj¡cych dªugo oblicze«
wy±wietlanie animacji i interfejsów u»ytkonika
Radosªaw Klimek J¦zyk programowania Java
Wkorzystanie w¡tków
Reasumuj¡c, w¡tki mo»na wykorzysta¢ w wielu sytuacjach:
Wszelkie obliczenia, które mog¡ zablokowa¢ interfejsu»ytkownika powinny by¢ wykonywane asynchronicznie
Animacje, które powinny by¢ przetwarzane niezale»nie odinterfejsu u»ytkownika
Pobieranie danych z internetu (zamiast przetwarza¢ stronyinternetowe jedna po drugiej mo»na poª¡czy¢ si¦ np. z 10jednocze±nie)
W ogólno±ci wszystkie operacje wej±cia/wyj±cia, zapis i odczytplików, czy baz danych
Zªo»one obliczenia, które mog¡ by¢ podzielone na mniejszepodzadania
I wiele innych
Radosªaw Klimek J¦zyk programowania Java
Jednow¡tkowa p¦tla zdarze«
W systemach jednow¡tkowych stosowane jest rozwi¡zanie zwanep¦tl¡ zdarze« z odpytywaniem. W takim modelu istnieje jednap¦tla niesko«czona, w której wykonywane s¡ kolejne w¡tkipobierane z kolejki procesów. Poszczególne w¡tki wykonywane s¡przez odpowiadaj¡ce im procedury obsªugi zdarze«. Do zako«czeniabie»¡cego w¡tku, nie mo»e by¢ w systemie podj¦te »adne innedziaªanie.
Radosªaw Klimek J¦zyk programowania Java
Systemy wielow¡tkowe
Równolegªo±¢ dziaªania w¡tków osi¡gana jest przez mechanizmprzydzielania czasu procesora poszczególnym wykonuj¡cym si¦w¡tkom. Ka»dy w¡tek uzyskuje dost¦p do procesora na kwantczasu, po czym przekazuje procesor innemu w¡tkowi. Zmiana w¡tkuwykonywanego przez procesor mo»e dokonywa¢ si¦ na zasadzie:
wspóªpracy � w¡tek sam decyduje, kiedy odda¢ czasprocesora innym w¡tkom,
wywªaszczania � o dost¦pie w¡tków do procesora decydujesystemowy zarz¡dca w¡tków, który przydziela w¡tkowi kwantczasu procesora, po upªywie którego odsuwa w¡tek odprocesora i przydziela kolejny kwant czasu innemu w¡tkowi.
Java jest j¦zykiem wieloplatformowym, a ró»ne systemy operacyjnestosuj¡ ró»ne mechanizmy udost¦pniania w¡tkom procesora.Programy wielow¡tkowe powinny by¢ tak pisane, by dziaªaªyzarówno w ±rodowisku �wspóªpracy� jak i �wywªaszczania�.
Radosªaw Klimek J¦zyk programowania Java
Systemy wielow¡tkowe
W sytemie wielow¡tkowym wykorzystuje si¦ fakt, »e wi¦kszo±¢czasu wykonywania w¡tku to czas oczekiwania na dost¦pn¡±¢zasobu. Je»eli wszystkie procesy s¡ niezale»nymi w¡tkami, a systempotra� przeªacza¢ si¦ pomi¦dzy w¡tkiem oczekuj¡cym na danyzasób, a w¡tkiem gotowym do dziaªania, to w tym samym czasiemo»na wykona¢ znacznie wi¦cej dziaªa«.
W Javie nie ma pojedy«czej p¦tli zdarze«. Je»eli jeden w¡tek np.:
odczytuje dane z sieci
czeka na dane wprowadzane przez u»ytkownika
albo wy±wietla animacje, nie wykonuj¡c »adnych innych dziaªa«
to pozostaªe w¡tki mog¡ dziaªa¢ bez jakichkolwiek przerw
Radosªaw Klimek J¦zyk programowania Java
Systemy wielow¡tkowe
Bardzo wa»ne jest równie» to, »e je±li uruchomimy jeden po drugimnp. 10 w¡tków, to wcale nie b¦d¡ one wykonywaªy si¦ sekwencyjniejeden po drugim, je±li sami o to nie zadbamy. Je±li jakie± zadanienie zd¡»y si¦ wykona¢ w czasie, który zostaª dla niego przydzielony,to mo»e ono zosta¢ przerwane na pewien czas.
Radosªaw Klimek J¦zyk programowania Java
Tworzenie w¡tków
W¡tki w Javie mo»na tworzy¢ na kilka sposobów, poprzez:
jawne rozszerzenie klasy Thread
stworzenie klasy implementuj¡cej interfejs Runnable, którymo»e by¢ wykonany w osobnym w¡tku (Thread)
stworzenie klasy implementuj¡cej interfejs Callable, którymo»e by¢ wykonany w osobnym w¡tku (Thread)
Preferowane jest stosowanie rozszerze« interfejsów, poniewa» daj¡one du»o lepsz¡ elastyczno±¢, szczególnie je±li dojdziemy domomentu szeregowania w¡tków, utrzymywania staªej puli w¡tkówwykonuj¡cych si¦ w tle. Interfejsy Runnable i Callable s¡ do siebiebardzo podobne, jednak najwa»niejsz¡ ró»nic¡ jest to, »e Callablemo»e zwróci¢ w wyniku pewn¡ warto±¢, natomiast w przypadkuRunnable nie ma takiej mo»liwo±ci.
Radosªaw Klimek J¦zyk programowania Java
Klasa Thread
Podobnie jak wszystkie poj¦cia Javy, w¡tki reprezentowane s¡ przezobiekty okre±lonej klasy. W¡tki reprezentowane s¡ przez obiektyklasy Thread, która zawiera wszystkie metody do zarz¡dzaniaw¡tkami. Klasa Thread jest jedynym elementem Javy pozwalaj¡cymna zarz¡dzanie w¡tkami. Ka»dy w¡tek w pewnm momencie zaczynasi¦, wykonuje okre±lon¡ liczb¦ dziaªa«, po czym ko«czy si¦.
Radosªaw Klimek J¦zyk programowania Java
Metody klasy Thread
Metody klasy Thread dzielimy na
Metody statyczne � wywoªuje si¦ je bezpo±rednio z nazw¡klasy:
Thread . cu r r en tTh read ( )
Metody zwi¡zane z obiektami � nie s¡ metodami statycznymi,mo»na z nich korzysta¢ dopiero po utworzeniu obiektu klasyThread.
Radosªaw Klimek J¦zyk programowania Java
Metody statyczne � zestawienie
Metoda currentThread() � zwraca obiekt klasy Threadreprezentuj¡cy bie»¡cy w¡tek.
Metoda yield() � poleca systemowi czasu przebiegu Javyprzerwanie wykonywania bie»acego w¡tku i przekazanieprocesora nast¦pnemu oczekuj¡cemu w¡tkowi. Jest to jedynysposób uzyskania pewno±ci, »e w¡tki o najni»szych priorytetachb¦d¡ kiedykolwiek wykonane.
Metoda sleep(int n) � poleca systemowi czasu przebieguu±pienie bie»acego w¡tku na n milisekund. Po upªywie tegoczasu w¡tek b¦dzie gotowy do dziaªania.
Radosªaw Klimek J¦zyk programowania Java
Metody zwi¡zane z obiektami � zestawienie
Trzy podstawowe metody klasy Thread:
Metoda start() � poleca utworzenie i uruchomienie nowegow¡tku. Jego dziaªanie polega na wykonaniu metody run()nale»¡cej do obiektu wskazanego podczas tworzenia danegow¡tku. Niedozwolone jest wielokrotne wywoªywanie tej metodydla tego samego w¡tku.
Metoda run() � Jest to zasadnicza cze±¢ ka»dego w¡tku. Nienale»y ona do klasy Thread, jest to jedyna metoda interfejsuRunnable. Wywoªuje j¡ metoda Metoda start() popoprawnym utworzeniu nowego w¡tku. Zako«czenie dziaªaniametody run() oznacza zatrzymanie zwi¡zanego z ni¡ w¡tku.
Metoda inerrupt() � umo»liwia przerwanie dziaªania w¡tku.
Radosªaw Klimek J¦zyk programowania Java
Inne metody klasy Thread � zestawienie
Metoda suspend() � zawieszenie w¡tku
Metoda resume() � wznawienie wykonywania zawieszonegow¡tku
Metoda setPriority(int p) � Ustawia priorytet w¡tku
Metoda getPriority() � Pobiera i zwraca priorytet w¡tku
Metoda setName(String name) � Ustawia nazw¦ w¡tku
Metoda getName() � Pobiera i zwraca nazw¦ w¡tku
Metoda stop() � powoduje natychmiastowe zatrzymaniew¡tku. W¡tek przestaje istnie¢.
i inne: wait(), notify(), notifyAll(), isAlive(), join()...
Radosªaw Klimek J¦zyk programowania Java
Tworzenie w¡tków
Program korzystaj¡cy z wi¦cej ni» jednego w¡tku mo»emy utworzy¢na dwa sposoby:
Bezpo±rednio poprzez dziedziczenie klasy Thread
Po±rednio poprzez implementacj¦ interfejsu Runnable .
Radosªaw Klimek J¦zyk programowania Java
Dziedziczenie klasy Thread
Bezpo±rednie dziedziczenie z klasy Thread
1 c l a s s MyThread extends Thread {2 . . .3 pub l i c void run ( ) {4 . . .5 }6 }
Tworzenie obiektu i uruchamianie w¡tku:
1 MyThread t = new MyThread ( ) ;2 t . s t a r t ( ) ;
Radosªaw Klimek J¦zyk programowania Java
Implementacja Runnable
Po±rednie poprzez implementacj¦ interfejsu Runnable.
1 c l a s s MyThreadR implements Runnable {2 . . .3 pub l i c void run ( ) {4 . . .5 }6 }
Tworzenie obiektu i uruchamianie w¡tku:
1 MyThreadR r = new MyThreadR ( ) ;2 Thread t = new Thread ( r ) ;3 t . s t a r t ( ) ;
Wykorzystanie interfejsu jest szczególnie przydatne, gdy dana klasa(klasa w¡tku) dziedziczy ju» z innej klasy (w Javie nie mo»nadziedziczy¢ z dwóch ró»nych klas).
Radosªaw Klimek J¦zyk programowania Java
Tworzenie i uruchamianie w¡tków � przykªad
Przykªadowa implementacja interfejsu Runnable:1 p u b l i c c l a s s Watek1 imp l ement s Runnable {2 p u b l i c v o i d run ( ) {3 System . out . p r i n t l n ( " to j e s t watek imp l ementu jacy i n t e r f e j s Runnable " ) ;4 }5 }
Rozszerzenie klasy Thread:1 p u b l i c c l a s s Watek2 e x t e nd s Thread {2 p u b l i c v o i d run ( ) {3 System . out . p r i n t l n ( " to j e s t watek r o z s z e r z a j a c y k l a s e Thread" ) ;4 }5 }
A teraz tworzymy i uruchamiamy nasze w¡tki:1 p u b l i c c l a s s Uruchom {23 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {4 Watek1 w1 = new Watek1 ( ) ;5 Watek2 w2 = new Watek2 ( ) ;67 ( new Thread (w1 ) ) . s t a r t ( ) ;8 w2 . s t a r t ( ) ;910 }11 }
Radosªaw Klimek J¦zyk programowania Java
Omówienie przykªadu
Tworzymy dwa w¡tki w1 i w2. Pierwszy z nich to obiekt klasyimplementuj¡cej interfejs Runnable, drugi to obiekt klasydziedzicz¡cej z klasy Thread. Tutaj wida¢ podstawow¡ ró»nic¦pomi¦dzy obiema metodami tworzenia klas. Zaimplementowanieinterfejsu wymusza stworzenie obiektu Thread, któremu jakoparametr konstruktora dajemy obiekt implementuj¡cy Runnable.Dopiero tak utworzony obiekt posiada metod¦ start(), którauruchamia w¡tek. Drugie podej±cie powoduje i» nie musimytworzy¢ dodatkowego obiektu.Które podej±cie jest lepsze? Oczywi±cie poprzez implementacj¦interfejsu Runnable poniewa»:
opiera si¦ na interfejsach co jest znacznie bardziej elastyczn¡metod¡ ni» dziedziczenie.
nie zaburza hierarchii klas poprzez dziedziczenie z klasyThread.
Radosªaw Klimek J¦zyk programowania Java
Priorytety w¡tków
Java z ka»dym w¡tkiem programu kojarzy priorytet, informuj¡cy otym jak nale»y traktowa¢ w¡tek w stosunku do innych w¡tkówprogramu.Priorytet jest liczb¡ caªkowit¡ z zakresu od MIN_PRIORITY(1)do MAX_PRIORITY (10) . Domy±lnym priorytetem jestNORM_PRIORITY (5).Ogólna zasada mówi, »e w¡tki o wysokich priorytech powinny by¢wykonywane cz¦±ciej ni» w¡tki o niskich priorytetech. Doustawiania priorytetu w¡tku sªu»y metoda: setPriority(int p).
Radosªaw Klimek J¦zyk programowania Java
Synchronizacja
Tworz¡c w¡tki nale»y pami¦ta¢, »e wspóªdziel¡ one pomi¦dzy sob¡pami¦¢ i zasoby. Mo»e to prowadzi¢ do kolizji, a te do bª¦dów.Bª¦dy spowodowane przez kolizje jest bardzo ci¦»ko znale¹¢ iusun¡¢. Je»eli dwa albo wi¦cej w¡tków ubiega si¦ dowspóªdzielonych zasobów to musimy zapewni¢ im synchronizacj¦.W Javie realizowana jest ona za pomoc¡ wbudowanych elementówj¦zykowych, tzw monitorów, czyli obiektu u»ywanego jako blokady,umo»liwiaj¡cej wzajemne wykluczanie si¦ w¡tków. W danej chwilitylko jeden w¡tek mo»e znajdowa¢ si¦ w monitorze � pozostaªe s¡w zawieszeniu, czekaj¡c na jego zwolnienie.
Radosªaw Klimek J¦zyk programowania Java
Przykªad bez synchronizacji
1 p u b l i c c l a s s Uruchom {2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {3 Watek1 w1 = new Watek1 ( ) ;4 Watek2 w2 = new Watek2 ( ) ;56 ( new Thread (w1 ) ) . s t a r t ( ) ;7 ( new Thread (w2 ) ) . s t a r t ( ) ;8 }9 p u b l i c c l a s s Watek1 imp l ement s Runnable {10 p u b l i c v o i d run ( ) {11 f o r ( i n t i = 0 ; i <100000; i ++){12 System . out . p r i n t l n ( "W¡tek1" ) ;13 }14 }15 }1617 p u b l i c c l a s s Watek2 imp l ement s Runnable {18 p u b l i c v o i d run ( ) {19 f o r ( i n t i = 0 ; i <100000; i ++){20 System . out . p r i n t l n ( "W¡tek2" ) ;21 }22 }23 }24 }
Po uruchomieniu programu oka»e si¦, »e przez pewien czaswypisywane s¡ naprzemiennie oba napisy. Z tego wnosek, »e w¡tkiwykonywane s¡ naprzemiennie.
Radosªaw Klimek J¦zyk programowania Java
Synchronized
Je»eli istnieje jedna lub wiecej metod maj¡cych wpªyw nawewn¦trzy stan obiektu w ±rodowisku wielow¡tkowym nale»yzastosowa¢ mechanizm synchronizacji. Poprzez umieszczenie tychmetod w blokach synchronizowanych u»ywakj¡c sªowa kluczowegosynchronized . Ogólna posta¢ bloku synchronizownego:
1 s y n c h r o n i z e d ( o b i e k t ) i n s t r u k c j a
obiekt � to odwoªanie do dowolnego obiektu.
instrukcja � to najcz¦sciej instrukcja zªo»ona zawieraj¡cawywoªanie jednej z metod obiektu.
albo:1 s y n c h r o n i z e d metoda (){}
gdzie metoda jest synchronizowan¡ metod¡.
Radosªaw Klimek J¦zyk programowania Java
Przykªad z synchronizacj¡1 p u b l i c c l a s s Uruchom {2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {3 Watek1 w1 = new Watek1 ( ) ;4 Watek2 w2 = new Watek2 ( ) ;56 ( new Thread (w1 ) ) . s t a r t ( ) ;7 w2 . s t a r t ( ) ;8 }910 p u b l i c s t a t i c s y n c h r o n i z e d v o i d wyp i s z ( S t r i n g t e k s t ){11 f o r ( i n t i = 0 ; i <10000; i++)12 System . out . p r i n t l n ( i+" : "+t e k s t ) ;13 }14 }1516 p u b l i c c l a s s Watek117 imp l ement s Runnable {18 p u b l i c v o i d run ( ) {19 Uruchom . wyp i s z ( "Watek1" ) ;20 }21 }2223 p u b l i c c l a s s Watek224 e x t e nd s Thread {25 p u b l i c v o i d run ( ) {26 Uruchom . wyp i s z ( "Watek2" ) ;27 }28 }
Po uruchomieniu programu nie zaobserwujemy ju» wymieszania si¦tekstów pochodz¡cych z ró»nych w¡tków.
Radosªaw Klimek J¦zyk programowania Java
Wyj¡tki
Wyj¡tek jest to nietypowa sytuacja pojawiaj¡ca si¦ podczaswykonywania programun np. wyst¡pienie bª¦du polegaj¡cego napróbie otwarcia pliku, który nie istnieje.
Java posiada mechanizm obsªugi wyj¡tków. Mechanizm obsªugiwyj¡tków w Javie umo»liwia zaprogramowanie "wyj±cia" sytuacjikrytycznych, dzi¦ki czemu program nie zawiesi si¦ po wyst¡pieniubª¦du wykonuj¡c ci¡g operacji obsªuguj¡cych wyj¡tek. Wyst¡pieniesytuacji wyj¡tkowej przerywa "normalny" tok wykonania programu.
Radosªaw Klimek J¦zyk programowania Java
Obsªuga wyj¡tków
Czyli:
Wyj¡tek powstaje na skutek jakiego± nieoczekiwanego bª¦du.
Wyj¡tek jest zgªaszany (lub mówi¡c inaczej - sygnalizowany).
Wyj¡tek jest (mo»e lub musi by¢) obsªugiwany.
Radosªaw Klimek J¦zyk programowania Java
Brak jawnej obsªugi wyj¡tku � przykªad
Próba dzielenia przez zero:
1 p u b l i c c l a s s NoCatch {2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {3 i n t a = 1 , b = 0 , c = 0 ;4 c = a/b ;5 System . out . p r i n t l n ( c ) ;6 }7 }
powstaªy bª¡d (wyj¡tek) spowoduje zako«czenie programu, a JVMwypisze komunikat o jego przyczynie.
1 Excep t i on i n th r ead "main" j a v a . l ang . A r i t hme t i cE x c ep t i o n : / by z e r o2 at NoCatch . main ( NoCatch . j a v a : 6 )
Radosªaw Klimek J¦zyk programowania Java
Obsªuga wyj¡tków
W Javie do obsªugi wyj¡tków sªu»y pi¦¢ sªów kluczowych:
try � okre±la sekwencj¦ instrukcji, podczas których mo»ewyst¡pi¢ bª¡d.
catch � przechwytuje wyj¡tek okre±lonego typu
throw � sªu»y do generowania wyj¡tków okre±lonego typu
throws � okre±la list¦ wszystkich wyj¡tków generowanychprzez dan¡ metod¦
�nally � blok instrukcji do obsªugi wyj¡tków wykonywanyzawsze, niezale»nie od tego czy dla danego wyj¡tku istnieje czynie istnieje blok catch
Radosªaw Klimek J¦zyk programowania Java
Blok try ... catch
Do obsªugi wyj¡tków sªu»y blok try ... catch.1 t r y {2 b l ok i n s t r u k c j i mog¡cy spowodowa¢ wy j¡ t ek3 }4 ca t ch (Typ_Wyjatku_1 identy f i ka to r_Wyja tku_1 ) {5 i n s t r u k c j a obs ªug1 wyj¡tku_16 }7 ca t ch (Typ_Wyjatku_2 identy f i ka to r_Wyja tku_2 ) {8 i n s t r u k c j a obs ªug1 wyj¡tku_29 }10 ca t ch (Typ_Wyjatku_N identy f ikator_Wyjatku_N ) {11 i n s t r u k c j a obs ªug1 wyj¡tku_N12 }13 [ f i n a l l y i n s t r u k c j a_ob s ª u g i wy j¡ tku ]
Po try nast¦puje blok instrukcji mog¡cych spowodowa¢ wyj¡tek.Je»eli podczas ich wykonywania zostanie on wygenerowany,wykonywanie zostanie przerwane, a sterowanie przekazane do blokucatch. Tu sprawdzane jest, czy która± z tych instrukcji odpowiadawygenerowanemu wyj¡tkowi. Je±li tak, wykonany zostanie kod poniej wyst¦puj¡cy, je»eli nie to kod z bloku �nally (je»eli takiistnieje). Instrukcje z bloku �nally wykonywane s¡ zawsze.
Radosªaw Klimek J¦zyk programowania Java
Blok try ... catch
sekwencja wykonywania bloku try ... catch:
Wykonywane s¡ kolejne instrukcje bloku try.
Je±li przy wykonaniu której± z instrukcji zostanie zgªoszonywyj¡tek, wykonanie bloku try jest przerywane w miejscuzgªoszenia wyjatku.
Sterowanie przekazywane jest do pierwszej w kolejno±ciklauzuli catch, w której podana w nawiasach okr¡gªych posªowie catch klasa wyj¡tku pasuje do typu powstalegowyj¡tku, czyli klasa wyjatku jest taka sama jak klasapowstaªego wyj¡tku lub jest jej dowoln¡ nadklas¡.
Nale»y najpierw zapisywa¢ kluazulecatch z bardziejszczegóªowymi klasami wyj¡tków: np. najpierwFileNotFoundException, a pó¹niej IOException, bo klasaFileNotFoundException jest pochodna od IOException.
Radosªaw Klimek J¦zyk programowania Java
Blok try ... catch
Inne klauzule catch nie s¡ ju» wykonywane.
Obsªuguj¡ca wyj¡tek klauzula catch mo»e zrobi¢ wiele rzeczy:m.in. zmieni¢ sekwencj¦ sterowania (np. poprzez return). Je±linie zmienia sekwencji sterowania to wykonanie programub¦dzie kontynuowane od nast¦pnej instrukcji po bloku try.
Ale niezaleznie od tego czy wyj¡tek powstaª czy nie iniezale»nie od tego czy ew. obsªuguj¡ca go klauzula catchzwraca sterowanie czy nie zawsze zaraz po zako«czeniemdziaªania bloku try wykonana zostanie klauzula �nally (o ilejest).
Radosªaw Klimek J¦zyk programowania Java
Przykªad � dzielenie przez zero
1 c l a s s d z i e l e n i e_p r z e z_ze r o2 {3 p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] )4 {5 i n t b = 0 ;6 i n t a = 100 ;7 i n t c ;8 S t r i n g wynik ;9 t r y10 {11 c = a / b ;12 wynik = "" + c ;13 }14 c a t ch15 {16 ( A r i t hme t i cE x c e p t i o n e )17 System . out . p r i n t l n ( "Niedozwolone d z i e l e n i e p r z e z ze r o " ) ;18 wynik = "∗∗∗" ;19 }20 System . out . p r i n t l n ( wynik )21 }22 }
Radosªaw Klimek J¦zyk programowania Java
Przykªad � dzielenie przez zero
W tym przypadku, wykonanie instrukcji c = a/b spowodujepowstanie wyj¡tku (dzielenie przez zero), a poniewa» instrukcja taznajduje si¦ w bloku try, w którym znajduje si¦ blok catch zodpowiednim typem wyj¡tku, to je»eli b = 0
sterowanie zostanie przekazane do kodu w catch
wyprowadzony zostanie napis "Niedozwolone dzielenie przezzero"
pod zmienn¡ wynik podstawione zostanie "***"
zostanie wypisana zmienna wynik czyli "***"
Gdyby zmienna b nie miaªa warto±ci zero, wyj¡tek by nie powstaª,kod z bloku catch nie zostaª by wykonany i wy±wietlony by zostaªwynik dzielenia a/b.
Radosªaw Klimek J¦zyk programowania Java
wyj¡tki - wery�kacja danych
Mechanizm obsªugi wyj¡tków mo»e by¢ wykorzystywany w bardzoró»ny sposób. Typowym przykªadem jest wery�kacjawprowadzanych danych. I tak od u»ytkownika »¡damywprowadzania liczb caªkowitych, a nast¦pnie za pomoc¡ metodyparseInt przeksztaªcamy ich znakow¡ reprezentacj¦ na binarn¡.Je»eli wprowadzony napis nie reprezentuje liczby caªkowitej, topowstaje wyj¡tek NumberFormatException. Powinnien by¢ onzawsze obsªugiwany. Pokazuje to nast¦puj¡cy program.
Radosªaw Klimek J¦zyk programowania Java
wyj¡tki - wery�kacja danych
1 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {23 S t r i n g s1 = JOptionPane . showInputD ia l og ( "Podaj p i e rw s z ¡ l i c z b ¦ " ) ;4 i f ( s1 != n u l l ) {5 S t r i n g s2 = JOptionPane . showInputD ia l og ( "Podaj drug¡ l i c z b ¦ " ) ;6 i f ( s2 != n u l l ) {7 i n t n1 ;8 i n t n2 ;9 t r y {10 n1 = I n t e g e r . p a r s e I n t ( s1 ) ;11 n2 = I n t e g e r . p a r s e I n t ( s2 ) ;12 } ca t ch ( NumberFormatException exc ) {13 System . out . p r i n t l n ( "Bª¦dne dane" ) ;14 r e t u r n ;15 }16 JOptionPane . showMessageDia log ( n u l l , "Suma : " + ( n1 + n2 ) ) ;17 }18 }19 }
Radosªaw Klimek J¦zyk programowania Java
Klasa wyj¡tków
Wyj¡tki s¡ obiektami klas wyj¡tków. NazwyNumberFormatException, ArithmeticException itd. s¡nazwami klas.
Zmienna exc w bloku catch - zawiera referencj¦ do obiektuodpowiedniej klasy wyj¡tku.
Radosªaw Klimek J¦zyk programowania Java
Klasa Throwable
Klasy wyj¡tków tworz¡ do±¢ rozbudowan¡ hierarchi¦ dziedzczeniaNadrz¦dn¡ klas¡ reprezentuj¡c¡ wyj¡tki jest klasa Throwable.Ka»da klasa wyst¦puj¡ca w bloku try ... catch jest jedn¡ z podklasklasy Throwable. Ma ona dwie bezpo±rednie podklasy:
Exception � u»ywa si¦ jej z wyj¡tkami generowanymi iprzechwytywanymi przez system.
Error � okre±la wyj¡tki, które w normalnej sytuacji niepowinny by¢ przechwytywane (s¡ to bardzo powa»ne bª¦dy).
Radosªaw Klimek J¦zyk programowania Java
Klasa RunTimeException
Szczególn¡ podklas¡ klasy Exception jest klasaRunTimeException dla wyj¡tków spowodowanych przez systemczasu przebiegu Javy, s¡ one generowane automatycznie.Podstawowa ró»nica pomi¦dzy tymi klasami polega na tym, »ewyj¡tki klas pochodnych od Exception. ale nieRuntimeException s¡ tzw. wyj¡tkami kontrolowanymi, cooznacza, »e musimy zapewni¢ ich obsªug¦ (kompilator zgªosi bª¡d,je±li tego nie zrobimy). Pozostaªych wyj¡tków obsªugiwa¢ niemusimy (ale mo»emy)
Radosªaw Klimek J¦zyk programowania Java
Zgªaszanie wyj¡tków � instrukcja Throw
Oprócz bloku try...catch Java dostarcza jescze inny sposóbezgªaszania wyj¡tków. Jest to instrukcja throw. Jest szczególnieprzydatna w przypadku wyj¡tków, których nie da si¦ obsªu»y¢, ichobsªuga nie ma sensu, lub po prostu ich wyst¡pienie mo»espowodowa¢ nieprawidªow¡ prac¦ w dalszych etapach programu.Jej skªadnia :
1 typ nazwa_metody ( ) th rows typ_wyj¡tku1 , typ_wyj¡tku2 , . . .2 {3 kod . . .4 throw new typ_wyjatku_1 ( ) ;5 throw new typ_wyjatku_2 ( ) ;6 kod7 }
Radosªaw Klimek J¦zyk programowania Java
Throws
W nagªówku metody musimy zadeklarowa¢, korzystaj¡c z instrukcjithrows, list¦ wyj¡tków jakie dana metoda mo»e wygenerowa¢.Pó¹niej w kodzie danej metody mo»na je zgªosi¢ (zazwyczaj np winstrukcji if) korzystaj¡c z instrukcji throw. Zgªasza¢ w ten sposóbmo»na wszystkie rodzaje wyj¡tków, czyli obiekty klas, którepo±rednio, lub bezpo±rednio dziedzicz¡ z klasy Throwable.
Kompilator wymaga deklarowania wyj¡tków reprezentowanychprzez klas¦ Exception oraz wi¦kszo±¢ jej podklas.
wyj¡tki klasy Error i RunTimeException oraz wszystkie jejpodklasy nie wymagaj¡ deklarowania.
Radosªaw Klimek J¦zyk programowania Java
Throw � przyklad
Program dziel¡cy liczb¦ 1000 przez liczb¦ podan¡ przezu»ytkownika.
1 impo r t j a v a . u t i l . Scanner ;23 p u b l i c c l a s s Main {4 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a g r s ) th rows Ar i t hme t i cE x c e p t i o n5 {6 doub l e l i c zba_1 = 1000 ;7 doub l e l i c zba_2 ;8 doub l e i l o r a z ;9 Scanner d z i e l n i k = new Scanner ( System . i n ) ;10 System . out . p r i n t ( "Podaj d z i e l n i k : " ) ;11 l i c zba_2 = d z i e l n i k . nextDoub le ( ) ;12 i f ( l i c zba_2 == 0)13 throw new Ar i t hme t i cE x c e p t i o n ( "Nie mozna d z i e l i ¢ p r z e z 0" ) ;14 e l s e15 {16 i l o r a z = l i c zba_1 / l i c zba_2 ;17 System . out . p r i n t l n ( "wynik d z i e l e n i a : "+ i l o r a z ) ;18 }19 }20 }
Radosªaw Klimek J¦zyk programowania Java