To tylko jedna z 8 stron tej notatki. Zaloguj się aby zobaczyć ten dokument.
Zobacz
całą notatkę
Wychwytywanie błędnych zachowań programu - asercje , wyjątki.
Pojęcia :
serwer - klasa udostępniająca jakąś usługę
klient - korzystający z usług serwera ( klasa, aplikacja, człowiek).
bład - fizyczny błąd występujący w oprogramowaniu ( error)
błędne wykonanie ( zachowanie) - objaw występowania błędu ( fault ).
Rodzaje błędów :
syntaktyczne - składniowe logiczne błędne zachowania klienta, sytuacje awaryjne w otoczeniu serwera.
Sposoby sygnalizacji błędnych zachowań :
wydruki kontrolne
kody powrotu z metod
zgłaszanie wyjątków
asercje
Wyjątki :
Wyjątki - obiekty służące do przekazywania informacji diagnostycznej .
Zgłaszanie wyjątku :
void f ( )
{ .....
if ( o = = null) throw new NullPointerException( " Nie przekazano obiektu ");
....
}
Postać instrukcji throw : throw new TypWyjatku(" opcjonalny komunikat diagnostyczny")
lub :
TypWyjatku e = new TypWyjatku("komunikat");
throw e;
Hierarchia klas ziązanych z obsługą wyjątków :
Throwable
Error
VirtualMachineError
AssertionError
Exception
RuntimeException
--- NulPointerException
--- IndexOutOfBoundsException
--- inne niekontrolowane wyjątki
IOException
inne kontrolowane wyjątki
Wyjątki klasy error sygnalizują poważne błędy systemowe, zazwyczaj nie są przechwytywane i nie powinno się wymuszać ich obsługi przez klienta.
Wyjątki klasy RuntimeException sygnalizują błędy programisty, czasami ich obsługa ma sens i wtedy je przechwytujemy, ale wymuszanie ich obsługi nie jest wskazane.
Wyjątki dziedziczące po klasie Exception sygnalizują błędne zachowanie otoczenia serwera na które serwer powinien być przygotowany, zazwyczaj ich obsługa jest możliwa i najczęściej jest wymuszana przez serwer.
Do wymuszania obsługi wyjątku służy klauzula throws.
void f ( ) throws NullPointerException
{ .....
if ( o = = null) throw new NullPointerException( " Nie przekazano obiektu ");
....
}
Jeśli mamy sensowną możliwość reakcji (np. poprawa wartości argumentu, doprecyzowanie informacji diagnostycznej itp. ) na wystąpienie wyjątku powinniśmy go przechwycić i obsłużyć - służą do tego instrukcje try ... catch.
(…)
… za poprawny ( patrz np. Data). Powinniśmy sprawdzać w każdej metodzie modyfikującej pola.
Rekurencja.
Tym razem tylko przykłady, wprowadzenie mam w pamięci operacyjnej.
Wersja trochę niedydaktyczna - tak na prawdę jest to przykład programowania strukturalnego , a nie obiektowego.
import java.io.*;
public class Kalkulator
{StreamTokenizer wej=new StreamTokenizer(new BufferedReader(new InputStreamReader…
… również zgłaszać nowe wyjątki w bloku catch.
Asercje :
Asercja jest to warunek logiczny sprawdzający czy stan programu ( wartości zmiennych ) jest zgodny z przyjętymi założeniami (ułatwia wykrywanie błędów logicznych programu). Stosowana przede wszystkim na etapie uruchamiania programu. Domyślnie java wyłącza sprawdzanie asercji. Włączenie wymaga ustawienia odpowiednich opcji kompilatora i loadera :
javac -source 1.4 MyClass.java
java -ea MyClass
W środowisku BlueJ trzeba ustawić opcję -ea ( i -eas jeśli chcemy objąć asercjami klasy systemowe ) dla maszyny wirtualnej :
czyli w pliku bluej.defs należy do wiersza bluej.vm.args dopisać -ea ( i ewentualnie usunąć znak komentarza '#' ), wiersz po zmianie :
bluej.vm.args=-server -Xincgc -ea -esa
Postać instrukcji assert :
assert warunek [ : wyrażenie]
jeśli warunek…
…();}
wej.nextToken();
return wart;
}
}
Tym razem wersja wykorzystująca klasy wewnętrzne. Moim zdaniemwprowadzone nieco na siłę. Dodana jest również częściowa kontrola poprawności zapisu wyrażenia.
import java.io.*;
public class Kalkulator
{StreamTokenizer wej= new StreamTokenizer(new BufferedReader(new InputStreamReader
(System.in)));
void oblicz() throws IOException
{ // ustawiamy analizator tak aby nowa linia…
... zobacz całą notatkę
Komentarze użytkowników (0)