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
import java.io.IOException;
class InnyMożliwyWyjątek extends Exception {}
class Zasób3 {
Zasób3(int i) {
//...
}
void zarezerwuj() {}
void używaj() throws IOException {}
void innaNiebezpiecznaOperacja() throws InnyMożliwyWyjątek {}
void zwolnij() {}
}
public class ZwalnianieZasobów3 {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
Zasób3 z = new Zasób3(i);
try {
z.zarezerwuj();
//tu jest niebezpieczny kod
z.używaj();
z.innaNiebezpiecznaOperacja();
if (i == 3) continue;
if (i == 8) return;
//...
//zwalnianie zasobów
z.zwolnij();
} catch (IOException e) {
//obsługa wyjątku IOException
} catch (InnyMożliwyWyjątek w) {
//obsługa wyjątku InnyMożliwyWyjątek
} finally {
//zwalnianie zasobów
z.zwolnij();
}
}
}
}
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
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) {}
}
}
}
}
Zadanie 3
Sprawdź, czy finally jest wykonywane pomimo wystąpienia wyjątku w bloku catch z tej samej instrukcji.
Rozwiązanie
public class Zad6 {
public static void main(String[] args) throws Exception {
try {
throw new Exception();
} catch (Exception e) {
System.out.println("catch");
throw new Exception();
} finally {
System.out.println("finally");
}
}
}