Несколько блоков catch в Java
В одном try может произойти сбой разного
типа. Если указать в catch только один
тип, остальные исключения не перехватятся
и программа остановится.
Решение - несколько блоков catch подряд.
Среда выполнения выбирает первый блок, тип
которого подходит к возникшему исключению:
try {
// risky code
} catch (NumberFormatException e) {
// handle format
} catch (ArithmeticException e) {
// handle division
}
Пусть метод делит два числа, переданные строками. Ошибка преобразования и деление на ноль обрабатываются разными сообщениями:
public class Main {
static void divideStrings(String a, String b) {
try {
int x = Integer.parseInt(a);
int y = Integer.parseInt(b);
System.out.println(x / y);
} catch (NumberFormatException e) {
System.out.println("not a number");
} catch (ArithmeticException e) {
System.out.println("division by zero");
}
}
public static void main(String[] args) {
divideStrings("10", "0");
divideStrings("10", "two");
}
}
Более конкретный catch ставят выше общего.
Если сначала написать широкий тип вроде
Exception, до узких типов выполнение
может не дойти. В начальных задачах достаточно
перечислять нужные типы по одному:
import java.util.ArrayList;
import java.util.Arrays;
ArrayList<Integer> data = new ArrayList<>(Arrays.asList(1, 2, 3));
String indexStr = "x";
try {
int i = Integer.parseInt(indexStr);
System.out.println(data.get(i));
} catch (NumberFormatException e) {
System.out.println("bad index text");
} catch (IndexOutOfBoundsException e) {
System.out.println("bad index value");
}
Дан код:
String left = "8";
String right = "0";
В try преобразуйте обе строки в int
и выведите частное первого на второе.
Для NumberFormatException выведите
"parse", для ArithmeticException
выведите "zero".
Дан код:
import java.util.ArrayList;
import java.util.Arrays;
ArrayList<String> tags = new ArrayList<>(Arrays.asList("a", "b", "c"));
String indexText = "9";
В одном try получите индекс из
indexText и элемент списка.
Отдельными catch обработайте
NumberFormatException и
IndexOutOfBoundsException разными
сообщениями на английском.