PO Wyjątki c.d. - ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
|||
Linia 42: | Linia 42: | ||
//zwalnianie zasobów | //zwalnianie zasobów | ||
z.zwolnij(); | z.zwolnij(); | ||
} | |||
} | |||
} | |||
} | |||
</div> | |||
</div> | |||
== 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ób3 { | |||
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 {} | |||
} | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''Rozwiązanie''' | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''public''' '''class''' ZwalnianieZasobów3 { | |||
'''public''' '''static''' '''void''' main(String[] args) '''throws''' Exception { | |||
'''for''' (int i = 0; i < 10; i++) { | |||
Zasób3 z1 = '''new''' Zasób3(i); | |||
Zasób3 z2 = '''new''' Zasób3(i); | |||
'''try''' { | |||
z1.zarezerwuj(); | |||
z2.zarezerwuj(); | |||
//tu jest niebezpieczny kod | |||
z1.używaj(); | |||
z2.używaj(); | |||
z1.innaNiebezpiecznaOperacja(); | |||
z2.innaNiebezpiecznaOperacja(); | |||
'''if''' (i == 3) '''continue'''; | |||
'''if''' (i == 8) '''return'''; | |||
//... | |||
//zwalnianie zasobów | |||
z1.zwolnij(); | |||
z2.zwolnij(); | |||
} '''catch''' (IOException e) { | |||
//obsługa wyjątku IOException | |||
} '''catch''' (InnyMożliwyWyjątek w) { | |||
//obsługa wyjątku InnyMożliwyWyjątek | |||
} '''finally''' { | |||
//obsługa wyjątków jest konieczna, | |||
//żeby nie dopuścić do zaginięcia JeszczeInnyMożliwyWyjątek | |||
'''try''' { | |||
z1.zwolnij(); | |||
} '''catch''' (IOException e) {} | |||
'''try''' { | |||
z2.zwolnij(); | |||
} '''catch''' (IOException e) {} | |||
} | } | ||
} | } |
Wersja z 11:21, 30 lip 2006
Zadanie 1
Zmodyfikuj klasę ZwalnianieZasobów2, aby zwalnianie odbywało się w klauzuli 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ób3 { 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