Sterowanie wykonaniem
mgr inż. Aleksander Bielski
www.iis.pwsz.elblag.pl/~alex
Program wykładu
2
Pętle w Javie
Są trzy konstrukcje pętli:
while
do
for
3
Pętla while
Ogólna postać:
while (wyrażenie_logiczne)
Instrukcja_lub_blok_instrukcji
Działanie:
Instrukcja_lub_blok_instrukcji jest wykonywane w pętli
dopóty, dopóki wyrażenie_logiczne ma wartość true.
Skutki:
Jeśli wartość Instrukcja_lub_blok_instrukcji nigdy nie
zmieni się na false, pętla będzie nieskończona
4
Pętla while c.d.
Wskazówka:
Zawsze jest lepiej używać poniższej konstrukcji, ponieważ
często się zdarza, że zamiast jednej linii w pętli chcemy
dodać jeszcze kilka:
while (warunek) {
instrukcja;
...
}
Przykład:
int i = 0;
while (i++ < 5)
System.out.println( pięć razy );
System.out.println( jeden raz );
5
Pętla do
Ogólna postać:
do
Instrukcja_lub_blok_instrukcji
while (wyrażenie_logiczne);
Podobnie jak w przypadku while lepiej użyć konstrukcji:
do {
zrób_coś
zrób_więcej
}
while (wyrażenie_logiczne);
6
Pętla do c.d.
Działanie:
Instrukcja_lub_blok_instrukcji jest wykonywane w pętli
dopóty, dopóki wyrażenie_logiczne ma wartość true.
Skutki:
Jeśli wartość Instrukcja_lub_blok_instrukcji nigdy nie
zmieni się na false, pętla będzie nieskończona
Instrukcja lub blok instrukcji zawsze jest wykonywana
przynajmniej jeden raz.
7
Pętla for
Ogólna postać:
for (instrukcja ; warunek ; wyrażenie)
ciało_pętli
lub używając bloku instrukcji:
for (instrukcja ; warunek ; wyrażenie)
{
zrób_coś
zrób_więcej
}
8
Pętla for c.d.
Działanie:
instrukcja jest wykonywana natychmiast po rozpoczęciu
pętli. Często się używa do ustawienia wartości początkowej.
warunek musi być wyrażeniem logicznym typu boolean.
Ciało pętli jest wykonywane dopóty, dopóki warunek ma
wartość true.
wyrażenie jest wykonywane po zakończeniu ciała pętli tuż
przed kolejnym sprawdzeniem warunku
Skutki:
Jeśli przy rozpoczęciu pętli warunek ma wartość false, ciało
pętli nie zostanie wykonane
9
Pętla for c.d.
int x;
for (x = 0; x < 10; x++) {
System.out.println( wartosc wynosi: + x);
}
jest równoznaczne z:
for (int x = 0; x < 10; x++) {
System.out.println( wartosc wynosi: + x);
}
10
Pętla for c.d.
Oraz równoznaczne z pętlą while:
{
int x = 0;
while (x < 10)
{
System.out.println( wartosc wynosi: + x);
x++;
}
}
11
Zakres widoczności zmiennej
Zakres widoczności zmiennej x,
zadeklarowanej w pętli for jest
ograniczony do ciała pętli i jej
częsci sterującej (tzn. instrukcja;
warunek; wyrażenie)
wyrażenie jest obliczane poza
ciałem pętli, przed tym jak
sterowanie wróci do sprawdzania
warunku.
12
Pusta pętla for
Dowolny element części sterującej
w pętli for() może zostać
pominięty.
Pominięcie części testującej jest
równoznaczne z umieszczeniem tam
wartości true.
for(;;) {}
tworzy zatem pętle nieskończoną
13
Pętla for a separator , (przecinek)
Separator , (przecinek) stosowany jest w specjalnych
przypadkach, gdy separator ; (średnik) nie może być
używany:
int j, k;
for (j = 3, k = 6; j + k < 20; j++, k +=2) {
System.out.println( wartosc j + j + wartosc k + k);
}
14
Pętla for a separator , (przecinek) c.d.
Uwaga1: nie można użyć separatora , w przypadkach
mieszanych, np. do oddzielania wyrażenia od deklaracji zmiennej,
wielokrotne deklaracje różnych typów:
int i = 7;
for (i++, int j = 0; i < 10; j++) { } // nieprawidłowe!
for (int i = 7, long j = 0; i < 10; j++) { } // nieprawidłowe!
Uwaga2: można użyć separatora , do oddzielania
wielokrotnych deklaracji tego samego typu:
for (int i = 7, j = 0; i < 10; j++) { }
15
break i continue
Działanie:
continue przerywa aktualną iterację pętli i wraca na początek
pętli rozpoczynając następną iterację;
break wychodzi z pętli pomijając resztę jej instrukcji:
for (int i = 0; i < 100; i++) {
if (i ==74) break; // wyjście z pętli
if ( i % 10 != 0 ) continue; // następna iteracja
System.out.println(i);
}
16
Etykiety
Java nie posiada instrukcji goto.
Posiada etykiety przed instrukcjami
iteracji, oraz etykietowane wersje
break i continue.
17
Etykiety: przykład
public static void main(String[] args) {
int i = 0;
zewnetrzny: for (; true; )
wewnetrzny: for (; i<10 ; i++) {
if (i==5) break zewnetrzny;
if (i==2) continue wewnetrzny;
}
}
18
Switch
Instrukcja wielokrotnego wyboru:
switch(wybor) {
case wartosc1: instrukcja;break;
case wartosc2: instrukcja;break;
case wartosc3: instrukcja;break;
...
default: instrukcja;
}
19
Switch c.d.
Instrukcja porównuje wynik wyrażenia
wybór z każdą ze stałych wartośćN:
jeśli jest przypadek zgodny z
wartośćN, wykonuje się odpowiednia
instrukcja
jeżeli nie istnieje taki
przypadek, wykonuje się instrukcja
default.
20
Switch c.d.
Jeśli instrukcja nie kończy się
przez break, to wykonują się kolejne
przypadki do napotkania break.
Wyrażenie wyboru w switch musi być
typu int, short, byte lub char.
Argument w liniach case musi być
stałą lub wyrażeniem stałym, którego
wynik może być obliczony w czasie
kompilacji
21
Switch c.d.
char c = (char)(Math.random()*26+'a');
System.out.print(c + : );
switch(c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
System.out.println( samogloska );
break;
default:
System.out.println( spolgloska );
}
22
If / else
Postać ogólna:
if (wyrażenie_logiczne)
instrukcja
lub z else:
if (wyrażenie_logiczne)
instrukcja
else
instrukcja
23
If / else c.d.
wyrażenie_logiczne
zwraca wartość logiczną
instrukcja
prosta instrukcja zakończona
średnikiem
blok instrukcji w nawiasach {...}
24
If / else: przykład
static int test(int val, int zakres); {
int wynik = 0;
if (val > zakres)
wynik = 1;
else if (val < zakres)
wynik = -1;
else wynik = 0;
return wynik;
}
25
Return
Funkcje:
ustala jaka wartość jest
zwracana przez metodę
powoduje że wartość jest
zwracana natychmiast
26
Return
static int test(int val, int zakres); {
if (val > zakres) return 1;
else if (val < zakres) return -1;
else return 0;
}
27
Wyjątki
Wyjątek jest wydarzeniem występującym
podczas wykonywania programu, który
powoduje przerwanie normalnego toku
wykonywania instrukcji.
W językach bez obsługi wyjątków, błędy są
wykrywane i obsługiwane ręcznie, zwykle
przez kody błędów.
W języku Java mechanizm wyjątków służy
do obsługi błędów.
28
Wyjątki c.d.
Powodem pojawiania się wyjątków są błędy i
nienormalne sytuacje np.:
brak pliku, do którego odwołuje się program,
zerwanie połączenia sieciowego,
próba wykonania operacji na argumentach
spoza dziedziny jak dzielenie przez zero czy
przekroczenie rozmiaru tablicy.
29
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.
30
Wyjątki w Javie c.d.
W Javie wyjątki są obiektami klas potomnych
klasy Throwable i dzielą się na dwa rodzaje:
wyjątki kontrolowane
wyjątki niekontrolowane
31
Wyjątki kontrolowane
wyjątki kontrolowane - pochodne klasy
Exception.
Kompilator sprawdza, czy metoda zgłasza tylko
te wyjątki, które jawnie wymienia w deklaracji
oraz to, czy zgłaszane wyjątki są
przechwytywane i obsługiwane,
32
Wyjątki niekontrolowane
wyjątki niekontrolowane - pochodne klas Error i
RuntimeException.
sygnalizują wystąpienie błędów fazy
wykonania związanych z pracą systemu
operacyjnego (np. brak pamięci) lub maszyny
wirtualnej
mogą wystąpić w dowolnym miejscu kodu.
Przyczyn wystąpienia wyjątków klasy Error
nie można usunąć z poziomu programu, a
skutkom trudno zaradzić, zatem nie są one
obsługiwane.
33
Wyjątki: hierarchia
34
Wyjątki: hierarchia c.d.
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.
wyjątki użytkownika
Error - nie do wyłapania przez programy użytkowe, błędy
środowiska wykonawczego
35
Instrukcje obsługi wyjątków
Do obsługi wyjątków służy instrukcja try-catch-finally o składni:
try {
instrukcje krytyczne
}
catch (typWyjątku1 identyfikator1) {
instrukcje obsługi wyjątku 1
}
catch (typWyjątku2 identyfikator2) {
instrukcje obsługi wyjątku 2
}
...
finally {
instrukcje wykonywane przed zakończeniem
}
36
Instrukcje obsługi wyjątków c.d.
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
37
Obsługa wyjątków: reguły
Fragment kodu, w którym (potencjalnie) może
zostać wyrzucony wyjątek umieszczany jest w
bloku try.
Jeśli wyjątek nie wystąpi, to po wykonaniu
wszystkich instrukcji bloku try, bloki catch są
pomijane.
Instrukcje bloku finally, jeśli został użyty (jest
opcjonalny) wykonywane są zawsze, niezależnie od
tego, czy w wykonywanym bloku try wyrzucony był
wyjątek i nastąpiło przejście do jednego z bloków
catch czy też nie.
38
Obsługa wyjątków: reguły c.d.
Pierwsze wystąpienie wyjątku w bloku try
powoduje przejście do odpowiedniego bloku catch,
którego typ deklarowanego wyjątku jest identyczny
z typem wyrzuconego wyjątku lub jest nadklasą.
Klauzula try może mieć wiele klauzul catch, ale
muszą one obsługiwać różne typy wyjątków.
Klauzule catch, w celu dopasowania wyjątku,
przeszukiwane są kolejno.
39
Obsługa wyjątków: reguły c.d.
Wyjątki typów bardziej szczególnych (podklas)
muszą być związane z wcześniejszymi klauzulami
catch danej klauzuli try.
Zawsze wykonywana jest co najwyżej jedna
klauzula catch.
40
Obsługa wyjątków: reguły c.d.
Jeśli żaden z bloków catch nie wychwyci wyjątku,
to jest on propagowany na zewnątrz instrukcji try-
catch-finally (i tam powinien być obsłużony).
Wyjątki wyrzucone wewnątrz bloków catch i
finally również propagowane są na zewnątrz.
Instrukcje try-catch-finally mogą być zagnieżdżane.
41
Przykład: bez obsługi wyjątków
class Program{
public static void main(String[] args){
System.out.println("Teraz wypisze pierwszy argument");
// tu mozemy miec problem
// gdy nie podano zadnych parametrów
System.out.println("Argument -> " + args[0]);
System.out.println("Jesli widzisz ten napis to sie powiodło ");
}
}
42
Przykład: z obsługą wyjątków
class Program2{
public static void main(String[] args){
System.out.println("Teraz wypisze pierwszy argument");
//Uwaga: niebezpieczenstwo
try{
System.out.println("Argument -> " + args[0]);
}
catch(Exception e){
//Tu sie znajdziemy gdy coś jest nie tak
System.out.println("UWAGA BLAD");
System.out.println("Program wymaga podania parametru");
}
System.out.println("Jesli widzisz ten napis to sie powiodło");
}
}
43
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");
}
44
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");
}
}
45
Try / 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.
46
przykład
import java.util.Random;
class ObslugaBledow {
public static void main(String args[]) {
int a = 0, b = 0, c = 0;
Random r = new Random();
for (int i=0; i<32000; i++) {
try {
b = r.nextInt();
c = r.nextInt();
a = 12345 / (b / c);
} //Obsługa błędu gdy jedna z pary liczb jest zerem:
catch (ArithmeticException e) {
System.out.println("Dzielenie przez 0"); a = 0;
}
System.out.println("i: " + i + "a: " + a);
}
}
}
47
Przykład 2
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;
48
Przykład 2
} //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");
}
}
49
Zagnieżdżone try-catch
class ZagniezdzonyTry {
public static void main(String args[]) {
try { // Zewnętrzny blok try
int a = args.length;
int b = 76 / a; //Ryzyko dzielenia przez zero
System.out.println("a= " + a);
try { //Wewnętrzny blok try
//Ryzyko dzielenia przez zero
if (a == 1) a = a /(a-a);
if (a == 2) {
//Wykroczenie poza zakres tablicy
int c[] = {1};
c[42] = 75;
}
} // wewnetrzny try catch
50
Zagnieżdżone try-catch c.d.
// wewnetrzny catch
catch(ArrayIndexOutOfBoundsException e {
System.out.println("Indeks poza tablica");
}
} // zewnetrzny try-catch
catch (ArithmeticException e) {
System.out.println("Dzielenie przez 0);
}
} // main
} // class
51
Zagnieżdzone try-catch c.d.
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
52
Generowanie wyjątków
Program użytkownika może sam generować 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
53
Instrukcja throw
Kolejność obsługi:
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
54
Generowanie wyjątków: przykład
public class WywolajWyjatek{
static public void main(String args[]) throws Exception{
Liczba liczba = new Liczba();
liczba.dziel(1);
}
}
class Liczba{
int m_i = 10;
int dziel(float i) throws Exception{
if (i/2 != 0) throw new Exception("Liczba nieparzysta!");
if (i == 0) throw new Exception("Dzielenie przez zero!");
return (int)(m_i/i);
}
}
55
Generowanie wyjątków c.d.
W metodzie Liczba.dziel() klasy WywolajWyjatek,
za pomocą frazy throw new Exception("..."),
generujemy wyjątek poprzez utworzenie obiektu
typu Exception i przerywamy wykonanie metody.
Obiekt ten musi być typu będącego podklasą klasy
Throwable.
56
Generowanie wyjątków c.d.
W programach zawsze generujemy wyjątki typu
Exceptions lub dowolnej podklasy Exceptions.
W ten sposób można w Javie wywoływać wyjątki,
dla sytuacji, które uważamy za nieprawidłowe.
W powyższym przykładzie założono, że
nieprawidłowa jest sytuacja gdy zmienna 'i' jest
liczbą nieparzystą lub jest równą zeru.
57
Fraza throws xxxException
Jeśli w definicji metody użyto frazy throws
xxxException, jej użycie informuje maszynę
wirtualną Javy i metodę wołającą, że metoda może
generować wyjątek typu xxxException.
Użycie frazy throws xxxException jest
obowiązkowe, jeśli metoda może generować wyjątek.
Każda metoda, która wywołuje metodę dziel() musi
zawierać blok catch obsługujący wyjątek albo frazę
throws xxxException wskazującą, że metoda może
być zródłem wyjątku
58
Przykłady
p1/ReadFile.java - program, który wyświetla na
ekranie zawartość pliku tekst.txt i próbuje zrobić to
samo dla pliku nieistniejacy.txt.
p2/ThrowDemo.java program, który demonstruje
generowanie i obsługę wyjątków.
59
Tworzenie 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. Jest
dostępny przez getMessage() w Throwable
60
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.
61
Przykład 1
Metoda wyrzuca wyjątek którego ani nie wyłapuje, ani nie
deklaruje.
Co się stanie przy próbie skompilowania i uruchomienia?
class ThrowsDemo1 {
static void metoda() {
System.out.println("Wewnatrz metody");
throw new IllegalAccessException("demo");
}
public static void main(String args[]) {
metoda();
}
}
62
Przykład 2
Co się stanie przy próbie skompilowania i uruchomienia?
class ThrowsDemo1 {
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);
}
}
}
63
finally
Zawiera 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
lub wykonać inne czynności.
Każdy try musi posiadać co najmniej jedną
instrukcję catch lub finally.
64
Wyjątki standardowe 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
65
Wyjątki standardowe c.d.
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 wskaznika null
66
Wyjątki standardowe c.d.
NumberFormatException - niepoprawna konwersja stringu
na format liczbowy
SecurityException - próba naruszenia bezpieczeństwa
StringIndexOutOfBoundsException - indeks poza zakresem
stringu
UnsupportedOperationException - napotkano niepoprawną
operację
67
Wyjątki sprawdzane
Metody które 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
68
Wyjątki sprawdzane c.d.
InterruptedException - jeden wątek przerwany przez
drugi
NoSuchFieldException - pole nie istnieje
NoSuchMethodException - metoda nie istnieje
69
Tworzenie własnych klas wyjątków
Utworzyć podklasę Exception.
Podklasa nie musi nic deklarować, musi tylko
istnieć.
Exception nie deklaruje własnych metod, ale
dziedziczy po Throwable.
Uwaga:
przykład znajduje się w p4/MojeWyjatki.java
70
Wyszukiwarka
Podobne podstrony:
PSWE W7 Podstawy teorii sterowaniaC w7 pliki operacje we wyautomatyka i sterowanie wykladEZNiOS Log 13 w7 zasobySterownik dwubarwnych diod LEDSterownik nadajnika do lowow na lisasterowniki programowalne plc, cz??? 3Sterownik oswietlenia kabiny samochoduOptymalne sterowanie i tradycyjny rachunek wariacyjny Dwuwymiarowe zagadnienie NewtonaPRZYCISKI STEROWANIA RT3Moduł zdalnego sterowania PC 1w7IiP z w7Sterowce latające dinozaurywięcej podobnych podstron