Метод с исключением в Java
Правила для параметров часто удобно держать внутри метода. Если значение не подходит, метод выбрасывает исключение, а вызывающий код решает, что показать пользователю.
Метод возвращает элемент списка по индексу
только для неотрицательного индекса. Иначе -
IllegalArgumentException:
import java.util.ArrayList;
public class Main {
static int getAt(ArrayList<Integer> list, int index) {
if (index < 0) {
throw new IllegalArgumentException("negative index");
}
return list.get(index);
}
}
Вызов оборачивают в try-catch, чтобы
отловить и неверный аргумент, и выход за
границы списка:
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
static int getAt(ArrayList<Integer> list, int index) {
if (index < 0) {
throw new IllegalArgumentException("negative index");
}
return list.get(index);
}
public static void main(String[] args) {
ArrayList<Integer> data = new ArrayList<>(Arrays.asList(10, 20, 30));
try {
System.out.println(getAt(data, -1));
} catch (IllegalArgumentException e) {
System.out.println("bad arg");
} catch (IndexOutOfBoundsException e) {
System.out.println("out of list");
}
}
}
Та же схема работает для проверки диапазона
процента. Несколько catch подряд позволяют
развести сообщения для разных типов сбоя
в одном месте вызова:
public class Main {
static void percent(int value) {
if (value < 0 || value > 100) {
throw new IllegalArgumentException("out of range");
}
System.out.println(value + "%");
}
public static void main(String[] args) {
try {
percent(150);
} catch (IllegalArgumentException e) {
System.out.println("invalid percent");
}
}
}
Создайте метод ensureNonNegative с
параметром n. Для n < 0
выбросьте new IllegalArgumentException
с сообщением "negative". Иначе
верните n.
Создайте метод divide с двумя
целыми параметрами. При b == 0
выбросьте new ArithmeticException.
Иначе верните частное. В main вызовите
его с нулевым делителем в try-catch
и выведите "fail" при ошибке.
Создайте метод charAtSafe со строкой
и индексом. При отрицательном индексе
выбросьте new IllegalArgumentException.
Иначе верните символ строки. Обработайте
вызов с слишком большим индексом через
StringIndexOutOfBoundsException.