Ошибки в Java могут быть разбиты на две категории: ошибки времени разработки и логические ошибки. В этом уроке вы научитесь обработки исключений с помощью оператора try … catch.
Ошибки времени разработки легко обнаружить, потому что NetBeans обычно подчеркивает их. Если ошибка не позволит запустить программу, NetBeans подчеркнет ее красным.
Логические ошибки - это те, которые вы делаете как программист. Программа запустится, но, поскольку вы сделали что-то не так в коде, есть большая вероятность, что произойдет сбой. Вскоре вы увидите примеры ошибок во время выполнения. Вы также узнаете, как с ними справляться. Но сначала немного о том, как Java обрабатывает ошибки.
Java обработка исключений оператором try … catch
В Java ошибки обрабатываются объектом Exception (исключение). Исключения выбрасывают ошибки, а ваша задача - поймать их. Вы можете сделать это с помощью оператора try ... catch.
Блок try ... catch выглядит так:
try { } catch (ТипИсключения переменная_ошибки) { }
Часть try блока try ... catch означает «попробовать этот код». Если что-то пойдет не так, Java перейдет к блоку catch. Java проверяет то, что в круглых скобках, обработали ли вы ошибку. Если у вас правильный тип исключения, тогда любой код, который у вас есть в фигурных скобках catch, будет выполнен. Если у вас неправильный типа исключения, Java будет использовать обработчик исключений по умолчанию для отображения сообщения об ошибке.
В качестве примера обработки исключений в Java создайте новое консольное приложение. Назовите его как вам угодно. В коде метода Main введите следующее:
try { int a = 5; int b = 0; int c = a / b; System.out.println(c); } catch (Exception show_error) { System.out.println(show_error.getMessage()); }
В части try блока try ... catch, мы создали три целых числа a, b и c. Мы хотим разделить a на b, а затем распечатать ответ.
Если что-то пойдет не так, у нас есть «план B». В круглых скобках мы написали это:
Exception show_error
Exception – это тип исключения, которое мы используем. В нашем случае это Exception объекта ошибки. Это тип исключения «поймать все» (catch all) и не самая лучшая практика программирования. Мы заменим Exception для обработки наших исключений Java на определенный тип в конце статьи.
После типа исключения идет имя переменной. Мы назвали нашу ошибку show_error, но вы можете называть свои ошибки как вам угодно.
В фигурных скобках catch у нас есть оператор println. Но главное, что мы поставили в круглых скобках println:
show_error.getMessage()
getMessage - это метод, доступный объектам Exception. Как следует из его названия, он получает сообщение об ошибке, связанное с исключением.
Запустите программу и протестируйте ее. Ваш код должен выглядеть примерно так:
package errors; public class ErrorsHand { public static void main(String[] args) { try { int a = 5; int b = 0; int c = a / b; System.out.println(c); } catch (Exception show_error) { System.out.println(show_error.getMessage()); } } }
И в окне «Вывод» должно отображаться следующее:
Другими словами, ошибка деления на ноль. Java не позволит вам разделить число на ноль, отсюда и сообщение об ошибке. Итак, мы совершили обработку исключений с помощью оператора try ... catch.
Измените в коде на это:
double a = 5.0; double b = 0; double c = a / b;
Остальная часть кода может остаться прежней. Запустите эту программу и протестируйте ее.
Опять же, сообщение об ошибке будет отображаться в окне вывода:
На этот раз Java останавливает программу, потому что результатом будет бесконечно большое число (Infinity).
Ошибки, связанные с числами, на самом деле не должны проходить обработку типом исключения «catch all». Существует определенный тип для такой обработки, называемый ArithmeticException. Удалите слово Exception в круглых скобках вашего блока catch. Замените его на ArithmeticException. Теперь запустите программу снова.
Вы не должны найти никакой разницы в сообщении об ошибке, отображаемом в окне вывода. Но вы используете правильную практику программирования, сужая тип ожидаемой ошибки.
Типы исключений
Исключения могут быть контролируемыми и неконтролируемыми. Разница состоит в следующем. Если метод может выбрасывать (генерировать) контролируемое исключение, и обработка этого исключения в методе не предусмотрена, то в сигнатуре этого метода необходимо указать ключевое слово throws и тип контролируемого исключения.
Самые распространенные неконтролируемые исключения Java
Тип исключения | С чем связана ошибка |
ArithmeticException | Выполнение арифметических операций (например, деление на ноль) |
ArrayIndexOutOfBoundsException | Индекс массива выходит за допустимые границы |
ArrayStoreException | Присвоение элементу массива значения несовместимого типа |
ClassCastException | Попытка выполнить приведение несовместимых типов |
IllegalArgumentException | Методу указан неправильный аргумент |
IllegalMonitorStateException | Работа с монитором (относится к многопоточному программированию) |
IllegalStateException | Ресурс находится в некорректном состоянии |
IllegalThreadStateException | Предпринята попытка выполнить некорректную операцию на потоке |
IndexOutOfBoundsException | Индекс выходит за допустимый диапазон значений |
NegativeArraySizeException | Попытка создать массив отрицательного размера |
NullPointerException | Некорректное использование ссылок (обычно когда объектная переменная содержит пустую ссылку) |
NumberFormatException | Преобразование строки к числовому значению (когда в число преобразуется строка, содержащая некорректное текстовое представление числа) |
SecurityException | Попытка нарушить режим защиты |
StringIndexOutOfBoundsException | Неверное индексирование при работе с текстовой строкой |
UnsupportedOperationException | Попытка выполнить некорректную операцию |
Контролируемые исключения Java
Тип исключения | С чем связана ошибка |
ClassNotFoundException | Невозможно найти нужный класс |
CloneNotSupportedException | Некорректная попытка клонировать объект |
IllegalAccessException | Ошибка доступа к ресурсу |
InstantiationException | Попытка создать объект абстрактного класса или интерфейса |
InterruptedException | Прерывание одного потока другим |
NoSuchFieldException | Отсутствует нужное поле |
NoSuchMethodException | Отсутствует нужный метод |
В следующем уроке вы узнаете, что такое отладка в Java.