Блок finally в Java
Иногда нужно выполнить код и при успехе, и при
ошибке: вывести итог, сбросить флаг, напечатать
разделитель. Для этого после catch
добавляют блок finally. Он запускается
всегда, когда завершилась пара try-catch:
try {
// risky code
} catch (RuntimeException e) {
// handle
} finally {
// always runs
}
Обратимся к несуществующему индексу списка
и в finally выведем количество элементов:
import java.util.ArrayList;
import java.util.Arrays;
ArrayList<Integer> nums = new ArrayList<>(Arrays.asList(10, 20, 30));
try {
System.out.println(nums.get(9));
} catch (IndexOutOfBoundsException e) {
System.out.println("bad index");
} finally {
System.out.println(nums.size());
}
Если исключения не было, catch пропускается,
но finally все равно выполнится:
import java.util.ArrayList;
import java.util.Arrays;
ArrayList<Integer> nums = new ArrayList<>(Arrays.asList(4, 5, 6));
try {
System.out.println(nums.get(0));
} catch (IndexOutOfBoundsException e) {
System.out.println("bad index");
} finally {
System.out.println("end");
}
Блок finally может стоять и без catch,
если исключение уходит выше, но завершающий
шаг все равно нужен. В учебных задачах чаще
используют полную форму try-catch-finally.
Дан код:
int a = 12;
int b = 0;
В try выведите a / b. При делении
на ноль выведите "error" в catch.
В finally выведите "finished".
Дан код:
String line = "42x";
В try выведите Integer.parseInt(line).
При NumberFormatException выведите
"nan". В finally выведите
длину строки line.