PO Wyjątki - ćwiczenia: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
(Nie pokazano 7 wersji utworzonych przez 2 użytkowników) | |||
Linia 13: | Linia 13: | ||
# Dołącz obsługiwany wyjątek do nowo tworzonego wyjątku ''Exception'' jako przyczynę jego powstania. | # Dołącz obsługiwany wyjątek do nowo tworzonego wyjątku ''Exception'' jako przyczynę jego powstania. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 1)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''public''' '''class''' Zad1 { | '''public''' '''class''' Zad1 { | ||
'''void''' wypiszDługość(String s) { | '''void''' wypiszDługość(String s) { | ||
Linia 25: | Linia 27: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 2)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''public''' '''class''' Zad1 { | '''public''' '''class''' Zad1 { | ||
'''void''' wypiszDługość(String s) { | '''void''' wypiszDługość(String s) { | ||
Linia 43: | Linia 46: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 3)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''public''' '''class''' Zad1 { | '''public''' '''class''' Zad1 { | ||
'''void''' wypiszDługość(String s) { | '''void''' wypiszDługość(String s) { | ||
Linia 62: | Linia 67: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 4)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Tak | Tak | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 5)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''public''' '''class''' Zad1 { | '''public''' '''class''' Zad1 { | ||
'''void''' wypiszDługość(String s) { | '''void''' wypiszDługość(String s) { | ||
Linia 87: | Linia 96: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 6)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''public''' '''class''' Zad1 { | '''public''' '''class''' Zad1 { | ||
'''void''' wypiszDługość(String s) { | '''void''' wypiszDługość(String s) { | ||
Linia 106: | Linia 117: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 7)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''public''' '''class''' Zad1 { | '''public''' '''class''' Zad1 { | ||
'''void''' wypiszDługość(String s) { | '''void''' wypiszDługość(String s) { | ||
Linia 124: | Linia 136: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 2 == | == Zadanie 2 == | ||
Linia 131: | Linia 143: | ||
# Sprawdź, co się stanie, jeżeli zmienisz kod metody tak, żeby przestała zgłaszać jeden z wyjątków, ale nadal będzie on wymieniony w klauzuli '''throws''' nagłówka metody. Czy metody wywołujące napisaną przez ciebie metodę, ale nie obsługujące tego wyjątku będą musiały nadal go wymieniać w swoich nagłówkach? | # Sprawdź, co się stanie, jeżeli zmienisz kod metody tak, żeby przestała zgłaszać jeden z wyjątków, ale nadal będzie on wymieniony w klauzuli '''throws''' nagłówka metody. Czy metody wywołujące napisaną przez ciebie metodę, ale nie obsługujące tego wyjątku będą musiały nadal go wymieniać w swoich nagłówkach? | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 1)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''class''' MójWyjątekA '''extends''' Exception {} | '''class''' MójWyjątekA '''extends''' Exception {} | ||
'''class''' MójWyjątekB '''extends''' Exception {} | '''class''' MójWyjątekB '''extends''' Exception {} | ||
Linia 160: | Linia 174: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie (Część 2)</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Tak, będą musiały. W ten sposób możemy wymusić, by kod korzystający z tej metody był przygotowany na wyjątek, który może się pojawić w jej kolejnej wersji. | Tak, będą musiały. W ten sposób możemy wymusić, by kod korzystający z tej metody był przygotowany na wyjątek, który może się pojawić w jej kolejnej wersji. | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 3 == | == Zadanie 3 == | ||
Napisz program sprawdzający, czy wyjątki zgłoszone w blokach '''catch''' mogą być obsłużone przez ten sam blok lub jeden z pozostałych bloków tej samej instrukcji '''try-catch'''. | Napisz program sprawdzający, czy wyjątki zgłoszone w blokach '''catch''' mogą być obsłużone przez ten sam blok lub jeden z pozostałych bloków tej samej instrukcji '''try-catch'''. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''class''' MójWyjątek '''extends''' Exception { | '''class''' MójWyjątek '''extends''' Exception { | ||
'''public''' MójWyjątek() { | '''public''' MójWyjątek() { | ||
Linia 196: | Linia 214: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 4 == | == Zadanie 4 == | ||
Linia 219: | Linia 237: | ||
} | } | ||
} | } | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''public''' '''class''' Zad4 { | '''public''' '''class''' Zad4 { | ||
'''void''' możeZgłosićWyjątek() '''throws''' Exception { | '''void''' możeZgłosićWyjątek() '''throws''' Exception { | ||
Linia 248: | Linia 268: | ||
} | } | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 5 == | == Zadanie 5 == | ||
Czy deklaracja wyjątków należy do sygnatury metody? Przygotuj przykład, który to rozstrzyga. | Czy deklaracja wyjątków należy do sygnatury metody? Przygotuj przykład, który to rozstrzyga. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Nie. Deklaracja wyjątków nie należy do sygnatury metody, tak samo jak wartość zwrotna. | Nie. Deklaracja wyjątków nie należy do sygnatury metody, tak samo jak wartość zwrotna. | ||
'''class''' WyjA '''extends''' Exception {} | '''class''' WyjA '''extends''' Exception {} | ||
Linia 264: | Linia 286: | ||
//void test() throws WyjB {} | //void test() throws WyjB {} | ||
//void test() throws WyjA, WyjB {} | //void test() throws WyjA, WyjB {} | ||
//void test() throws | //void test() throws Exception {} | ||
} | } | ||
</div> | </div> | ||
</div> | </div> |
Aktualna wersja na dzień 20:23, 28 maj 2020
<<< Powrót do przedmiotu Programowanie obiektowe
Zadanie 1
Napisz metodę, która jako parametr będzie przyjmowała napis i wypisywała na standardowe wyjście jego długość.
- Przekaż do tej metody null i zobacz, jaki wyjątek został zgłoszony.
- Otocz wywołanie metody blokiem try-catch, przechwyć ten wyjątek i wypisz na standardowe wyjście ślad stosu wywołań z chwili zgłoszenia wyjątku.
- Bezpośrednio po wypisaniu jego śladu zgłoś obsługiwany wyjątek ponownie.
- Czy ślady stosu wypisane przez ciebie w bloku catch i przez maszynę wirtualną w chwili przerwania programu są takie same?
- Przed zgłoszeniem ponownie obsługiwanego wyjątku wykonaj na nim metodę fillInStackTrace().
- Zamiast zgłaszać ponownie obsługiwany wyjątek, zgłoś nowy wyjątek klasy Exception. Zauważ, że wymaga to pewnej dodatkowej zmiany w kodzie.
- Dołącz obsługiwany wyjątek do nowo tworzonego wyjątku Exception jako przyczynę jego powstania.
Rozwiązanie (Część 1)
Rozwiązanie (Część 2)
Rozwiązanie (Część 3)
Rozwiązanie (Część 4)
Rozwiązanie (Część 5)
Rozwiązanie (Część 6)
Rozwiązanie (Część 7)
Zadanie 2
Napisz trzy nowe wyjątki oraz metodę, która za każdym wywołanie będzie losowo zgłaszała jeden z nich.
- Otocz wywołanie tej metody instrukcją try-catch zawierającą po jednym bloku catch dla każdego z wyjątków. Niech każdy blok catch wypisuje, który wyjątek złapała.
- Sprawdź, co się stanie, jeżeli zmienisz kod metody tak, żeby przestała zgłaszać jeden z wyjątków, ale nadal będzie on wymieniony w klauzuli throws nagłówka metody. Czy metody wywołujące napisaną przez ciebie metodę, ale nie obsługujące tego wyjątku będą musiały nadal go wymieniać w swoich nagłówkach?
Rozwiązanie (Część 1)
Rozwiązanie (Część 2)
Zadanie 3
Napisz program sprawdzający, czy wyjątki zgłoszone w blokach catch mogą być obsłużone przez ten sam blok lub jeden z pozostałych bloków tej samej instrukcji try-catch.
Rozwiązanie
Zadanie 4
W poniższym przykładzie w bloku try jest pięć instrukcji. Każda z nich może zgłosić taki sam wyjątek. Zaproponuj rozwiązanie, które w kodzie obsługi wyjątku pozwoli sprawdzić, w której instrukcji on wystąpił.
public class Zad4 { void możeZgłosićWyjątek() throws Exception { if (new java.util.Random().nextInt(5) == 0) throw new Exception(); } public static void main(String[] args) { Zad4 z = new Zad4(); try { z.możeZgłosićWyjątek(); z.możeZgłosićWyjątek(); z.możeZgłosićWyjątek(); z.możeZgłosićWyjątek(); z.możeZgłosićWyjątek(); } catch (Exception e) { //jakiś kod obsługi } } }
Rozwiązanie
Zadanie 5
Czy deklaracja wyjątków należy do sygnatury metody? Przygotuj przykład, który to rozstrzyga.
Rozwiązanie