Skip to content

Latest commit

History

History
176 lines (137 loc) · 6.46 KB

File metadata and controls

176 lines (137 loc) · 6.46 KB

⚠️ ArithmeticException: деление на ноль

(Все примеры и подробные объяснения собраны в Wiki репозитория.)

ArithmeticException возникает при делении на ноль или других арифметических ошибках.
В этом материале я разбираю 4 способа обработки этой ошибки — от самого простого до более продвинутого.


Что такое ArithmeticException?

Когда в Java мы пытаемся разделить число на ноль:

intresult = 10 / 0; // ❌ ArithmeticException

Программа падает с ошибкой. Чтобы этого избежать, используем try-catch.

Пример 1: обрабатываем только ArithmeticException

Код:

publicstaticvoidmain(String[] args) {
inta = 10;
intb = 0;
try {
System.out.println(a / b);
} catch (ArithmeticExceptione) {
System.out.println("Деление на ноль");
}
}

Что происходит:

  1. try — пытаемся выполнить деление 10 / 0
  2. Возникает ArithmeticException
  3. catch (ArithmeticException e) — ловим именно эту ошибку
  4. Выводим сообщение "Деление на ноль"

Вывод:

Деление на ноль

Мои заметки:

Этот catch поймает только ArithmeticException. Если возникнет любая другая ошибка, программа всё равно упадёт.


Пример 2: обрабатываем все исключения (Exception)

Код:

publicstaticvoidmain(String[] args) {
inta = 10;
intb = 0;
try {
System.out.println(a / b);
} catch (Exceptione) {
System.out.println("Деление на 0");
}
}

Что происходит:

  1. catch (Exception e) — ловит любое исключение, потому что Exception — это родитель всех исключений

Вывод:

Деление на 0

Мои заметки:

Exception ловит всё: и ArithmeticException, и NullPointerException, и любые другие.
Удобно, но иногда слишком широко — не поймёшь, какая именно ошибка случилась.


Пример 3: несколько catch блоков

Код:

publicstaticvoidmain(String[] args) {
inta = 10;
intb = 0;
try {
System.out.println(a / b);
} catch (ArithmeticExceptione) {
System.out.println("Деление на 0");
} catch (Exceptione) {
System.out.println("Другая ошибка");
}
}

Что происходит:

  1. Сначала Java пытается подойти под ArithmeticException — подходит, так как ошибка именно эта
  2. Первый catch обрабатывает ошибку, второй catch игнорируется

Вывод:

Деление на 0

Мои заметки:

  • catch проверяются по порядку: от частного к общему
  • ArithmeticException — частный случай Exception, поэтому он должен идти первым
  • Если поменять порядок (сначала Exception, потом ArithmeticException) — будет ошибка компиляции

Пример 4: выбрасываем исключение вручную через throw

Код:

publicstaticvoidmain(String[] args) {
inta = 10;
intb = 0;
try {
System.out.println(divide(a, b));
} catch (Exceptione) {
System.out.println("Ошибка: " + e.getMessage());
}
}
publicstaticintdivide(inta, intb) {
if (b == 0) {
thrownewArithmeticException("Делить на ноль нельзя");
}
returna / b;
}

Что происходит:

  1. В методе divide проверяем, не равен ли b нулю
  2. Если b == 0 — сами создаём исключение через throw new ArithmeticException(...)
  3. В main ловим это исключение и выводим сообщение из исключения через e.getMessage()

Вывод:

Ошибка: Делить на ноль нельзя

Мои заметки:

  • throw — создаёт исключение вручную (в отличие от throws, который просто объявляет, что исключение может быть)
  • e.getMessage() — возвращает текст, который мы передали в конструктор исключения
  • Этот подход позволяет создавать понятные сообщения об ошибках

Сравнение всех четырёх примеров

ПримерЧто делаетКогда использовать
1Ловит только ArithmeticExceptionКогда нужно обработать конкретную ошибку
2Ловит все исключения (Exception)Когда нужно перехватить любую ошибку
3Несколько catch для разных типовКогда на разные ошибки нужны разные действия
4throw + своё сообщениеКогда нужно самим решить, когда выбрасывать исключение

Что я запомнила

  • ArithmeticException — возникает при делении на ноль
  • catch (Exception e) — ловит все исключения
  • Порядок catch важен: от частного к общему
  • throw — создаём исключение сами
  • e.getMessage() — получаем текст ошибки

⭐ Когда моя программа падает с ArithmeticException, я открываю этот файл и вспоминаю, как правильно обрабатывать деление на ноль.