PO Wyjątki c.d. - ćwiczenia: Różnice pomiędzy wersjami
Linia 156: | Linia 156: | ||
'''class''' Nadklasa1 { | '''class''' Nadklasa1 { | ||
Nadklasa1() '''throws''' Exception {} | Nadklasa1() '''throws''' Exception {} | ||
Nadklasa1(int i) '''throws''' Exception {} | Nadklasa1('''int''' i) '''throws''' Exception {} | ||
} | } | ||
Linia 165: | Linia 165: | ||
} | } | ||
Podklasa1(int i) '''throws''' Exception { | Podklasa1('''int''' i) '''throws''' Exception { | ||
//pierwszą instrukcją jest try-catch, | //pierwszą instrukcją jest try-catch, | ||
//więc kompilator uzna, że nie wskazujemy konstruktora nadklasy | //więc kompilator uzna, że nie wskazujemy konstruktora nadklasy | ||
Linia 181: | Linia 181: | ||
{{rozwiazanie|(część 2)||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | {{rozwiazanie|(część 2)||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
'''class''' Nadklasa2 { | '''class''' Nadklasa2 { | ||
int dajInt() { | '''int''' dajInt() { | ||
System.out.println("Nadklasa2.dajInt()"); | System.out.println("Nadklasa2.dajInt()"); | ||
'''return''' 0; | '''return''' 0; | ||
} | } | ||
int i = dajInt(); | '''int''' i = dajInt(); | ||
{ | { | ||
Linia 191: | Linia 191: | ||
} | } | ||
Nadklasa2(int i) { | Nadklasa2('''int''' i) { | ||
System.out.println("konstruktor nadklasy"); | System.out.println("konstruktor nadklasy"); | ||
} | } | ||
Linia 201: | Linia 201: | ||
} | } | ||
int inneDajInt() { | '''int''' inneDajInt() { | ||
System.out.println("Podklasa2.inneDajInt()"); | System.out.println("Podklasa2.inneDajInt()"); | ||
'''return''' 0; | '''return''' 0; | ||
} | } | ||
int i = inneDajInt(); | '''int''' i = inneDajInt(); | ||
Podklasa2() { | Podklasa2() { |
Wersja z 14:56, 18 sie 2006
Zadanie 1
Zmodyfikuj klasę ZwalnianieZasobów2, aby zwalnianie odbywało się w bloku finally. Sprawdź, czy rzeczywiście zasób jest zwalniany nawet jak blok try jest opuszczany przy pomocy instrukcji return, break i continue.
Rozwiązanie
Zadanie 2
Podczas rezerwowania i zwalniania zasobów zazwyczaj też może wystąpić wyjątek. Użyj pokazanej poniższej klasy Zasób3 i zmodyfikuj swoje rozwiązanie poprzedniego zadania, tak aby zawsze oba zasoby były zwalniane. Zadbaj żeby nie dochodziło do zaginięcia żadnych wyjątków. Możesz założyć, że wykonanie operacji zwolnij() na zamkniętym zasobie jest dozwolone.
class InnyMożliwyWyjątek extends Exception {} class JeszczeInnyMożliwyWyjątek extends Exception {} class Zasób4 { Zasób3(int i) { //... } void zarezerwuj() throws IOException {} void używaj() throws IOException {} void innaNiebezpiecznaOperacja() throws InnyMożliwyWyjątek, JeszczeInnyMożliwyWyjątek {} void zwolnij() throws IOException {} }
Rozwiązanie
Zadanie 3
Sprawdź, czy finally jest wykonywane pomimo wystąpienia wyjątku w bloku catch z tej samej instrukcji.
Rozwiązanie
Zadanie 4
Napisz klasę, której konstruktor zgłasza wyjątek. W metodzie main() utwórz egzemplarz tej klasy i obsłuż wyjątek.
Rozwiązanie
Zadanie 5
Sprawdź, że konstruktor podklasy nie może obsłużyć wyjątków zgłaszanych przez konstruktor nadklasy. Napisz przykładowy kod pokazujący, że konstruktor nadklasy jest wykonywany wcześniej niż wskazuje na to umiejscowienie słowa super w konstruktorze podklasy.
Rozwiązanie (część 1)
Rozwiązanie (część 2)
Zadanie 6
Zmodyfikuj definicje wyjątków w przykładzie z PerpetuumMobile tak, aby metoda jedź() mogła zgłaszać wyjątek ŁamiePrawaFizyki
Rozwiązanie