ArithmeticException возникает при делении на ноль или других арифметических ошибках.
В этом материале я разбираю 4 способа обработки этой ошибки — от самого простого до более продвинутого.
Когда в Java мы пытаемся разделить число на ноль:
int result = 10 / 0; // ❌ ArithmeticExceptionПрограмма падает с ошибкой. Чтобы этого избежать, используем try-catch.
Код:
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("Деление на ноль");
}
}Что происходит:
try— пытаемся выполнить деление10 / 0- Возникает
ArithmeticException catch (ArithmeticException e)— ловим именно эту ошибку- Выводим сообщение
"Деление на ноль"
Вывод:
Деление на ноль
Этот catch поймает только ArithmeticException. Если возникнет любая другая ошибка, программа всё равно упадёт.
Код:
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
System.out.println(a / b);
} catch (Exception e) {
System.out.println("Деление на 0");
}
}Что происходит:
catch (Exception e)— ловит любое исключение, потому что Exception — это родитель всех исключений
Вывод:
Деление на 0
Exception ловит всё: и ArithmeticException, и NullPointerException, и любые другие.
Удобно, но иногда слишком широко — не поймёшь, какая именно ошибка случилась.
Код:
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("Деление на 0");
} catch (Exception e) {
System.out.println("Другая ошибка");
}
}Что происходит:
- Сначала Java пытается подойти под
ArithmeticException— подходит, так как ошибка именно эта - Первый
catchобрабатывает ошибку, второйcatchигнорируется
Вывод:
Деление на 0
catchпроверяются по порядку: от частного к общемуArithmeticException— частный случайException, поэтому он должен идти первым- Если поменять порядок (сначала
Exception, потомArithmeticException) — будет ошибка компиляции
Код:
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
System.out.println(divide(a, b));
} catch (Exception e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
public static int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("Делить на ноль нельзя");
}
return a / b;
}Что происходит:
- В методе
divideпроверяем, не равен лиbнулю - Если
b == 0— сами создаём исключение черезthrow new ArithmeticException(...) - В
mainловим это исключение и выводим сообщение из исключения черезe.getMessage()
Вывод:
Ошибка: Делить на ноль нельзя
throw— создаёт исключение вручную (в отличие отthrows, который просто объявляет, что исключение может быть)e.getMessage()— возвращает текст, который мы передали в конструктор исключения- Этот подход позволяет создавать понятные сообщения об ошибках
| Пример | Что делает | Когда использовать |
|---|---|---|
| 1 | Ловит только ArithmeticException |
Когда нужно обработать конкретную ошибку |
| 2 | Ловит все исключения (Exception) |
Когда нужно перехватить любую ошибку |
| 3 | Несколько catch для разных типов |
Когда на разные ошибки нужны разные действия |
| 4 | throw + своё сообщение |
Когда нужно самим решить, когда выбрасывать исключение |
ArithmeticException— возникает при делении на нольcatch (Exception e)— ловит все исключения- Порядок
catchважен: от частного к общему throw— создаём исключение самиe.getMessage()— получаем текст ошибки
⭐ Когда моя программа падает с ArithmeticException, я открываю этот файл и вспоминаю, как правильно обрабатывать деление на ноль.