Рубрики
Без рубрики

Общие исключения Java

Краткий обзор распространенных исключений Java.

Автор оригинала: baeldung.

1. введение

Этот учебник посвящен некоторым распространенным исключениям Java.

Мы начнем с обсуждения того, что в основном представляет собой исключение. Позже мы подробно обсудим различные типы проверенных и непроверенных исключений.

2. Исключения

Исключение – это ненормальное состояние, возникающее в последовательности кода во время выполнения программы. Это ненормальное состояние возникает, когда программа нарушает определенные ограничения во время выполнения.

Все типы исключений являются подклассами класса Exception . Затем этот класс подразделяется на проверенные исключения и непроверенные исключения. Мы подробно рассмотрим их в последующих разделах.

3. Проверенные Исключения

Проверенные исключения являются обязательными для обработки. Они являются прямыми подклассами класса Исключение .

Есть дебаты об их важности, на которые стоит взглянуть.

Давайте подробно определим некоторые проверенные исключения.

3.1. Исключение IOException

Метод вызывает исключение IOException или его прямой подкласс, когда какая-либо операция ввода-вывода завершается неудачно.

Типичное использование этих операций ввода-вывода включает в себя:

  • Работа с файловой системой или потоками данных с помощью java.io пакет
  • Создание сетевых приложений с помощью java.net пакет

Исключение FileNotFoundException

FileNotFoundException является распространенным типом IOException при работе с файловой системой:

try {
    new FileReader(new File("/invalid/file/location"));
} catch (FileNotFoundException e) {
    LOGGER.info("FileNotFoundException caught!");
}

Исключение MalformedURLException

При работе с URL-адресами мы можем столкнуться с MalformedURLException– , если наши URL-адреса недействительны.

try {
    new URL("malformedurl");
} catch (MalformedURLException e) {
    LOGGER.error("MalformedURLException caught!");
}

3.2. Исключение синтаксического анализа

Java использует синтаксический анализ текста для создания объекта на основе заданной строки . Если синтаксический анализ вызывает ошибку, он вызывает исключение ParseException .

Например, мы могли бы представлять Данные по-разному,например dd/mm/yyyy или dd,mm, yyyy, , но попробуйте проанализировать строку в другом формате:

try {
    new SimpleDateFormat("MM, dd, yyyy").parse("invalid-date");
} catch (ParseException e) {
    LOGGER.error("ParseException caught!");
}

Здесь строка | искажена и вызывает исключение ParseException .

3.3. Исключение прерывания

Всякий раз, когда поток Java вызывает join(), sleep() или wait () , он переходит либо в состояние WAITING , либо в состояние TIMED_WAITING .

Кроме того, поток может прервать другой поток, вызвав метод interrupt() другого потока.

Следовательно, поток создает исключение InterruptedException , если другой поток прерывает его, пока он находится в состоянии ОЖИДАНИЯ или в состоянии TIMED_WAITING .

Рассмотрим следующий пример с двумя потоками:

  • Основной поток запускает дочерний поток и прерывает его
  • Дочерний поток запускается и вызывает sleep()

Этот сценарий приводит к исключению InterruptedException:

class ChildThread extends Thread {

    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            LOGGER.error("InterruptedException caught!");
        }
    }
}

public class MainThread {

    public static void main(String[] args) 
      throws InterruptedException {
        ChildThread childThread = new ChildThread();
        childThread.start();
        childThread.interrupt();
    }
}

4. Непроверенные Исключения

Для непроверенных исключений компилятор не проверяет во время процесса компиляции. Следовательно, метод не является обязательным для обработки этих исключений.

Все непроверенные исключения расширяют класс RuntimeException.

Давайте подробно обсудим некоторые непроверенные исключения.

4.1. Исключение NullPointerException

Если приложение пытается использовать нулевой там, где на самом деле требуется экземпляр объекта, метод вызовет Исключение NullPointerException .

Существуют различные сценарии, в которых незаконное использование null вызывает NullPointerException. Давайте рассмотрим некоторые из них.

Вызов метода класса, не имеющего экземпляра объекта:

String strObj = null;
strObj.equals("Hello World"); // throws NullPointerException.

Кроме того, если приложение пытается получить доступ или изменить переменную экземпляра со ссылкой null , мы получаем исключение NullPointerException:

Person personObj = null;
String name = personObj.personName; // Accessing the field of a null object
personObj.personName = "Jon Doe"; // Modifying the field of a null object

4.2. Исключение ArrayIndexOutOfBoundsException

Массив хранит свои элементы в непрерывном режиме. Таким образом, мы можем получить доступ к его элементам через индексы.

Однако , если фрагмент кода пытается получить доступ к незаконному индексу массива, соответствующий метод вызывает исключение ArrayIndexOutOfBoundException.

Давайте рассмотрим несколько примеров, которые бросают Arrayindexoutofboundsexception :

int[] nums = new int[] {1, 2, 3};
int numFromNegativeIndex = nums[-1]; // Trying to access at negative index
int numFromGreaterIndex = nums[4];   // Trying to access at greater index
int numFromLengthIndex = nums[3];    // Trying to access at index equal to size of the array

4.3. Исключение StringIndexOutOfBoundsException

Класс String в Java предоставляет методы для доступа к определенному символу строки или для вырезания массива символов из строки . Когда мы используем эти методы, внутренне он преобразует Строку в массив символов.

Опять же, может быть незаконное использование индексов в этом массиве. В таких случаях эти методы класса String вызывают исключение StringIndexOutOfBoundsException .

Это исключение указывает на то, что индекс либо больше, либо равен размеру строки . StringIndexOutOfBoundsException extends IndexOutOfBoundsException .

Метод charAt(index) класса String выдает это исключение, когда мы пытаемся получить доступ к символу с индексом, равным длине строки или какому-либо другому незаконному индексу:

String str = "Hello World";
char charAtNegativeIndex = str.charAt(-1); // Trying to access at negative index
char charAtLengthIndex = str.charAt(11);   // Trying to access at index equal to size of the string		

4.4. Исключение NumberFormatException

Довольно часто приложение заканчивается числовыми данными в строке |. Чтобы интерпретировать эти данные как числовые, Java позволяет преобразовать String в числовые типы. Классы-оболочки, такие как Integer, Float и т. Д. содержит служебные методы для этой цели.

Однако если Строка не имеет соответствующего формата во время преобразования, метод вызывает исключение NumberFormatException.

Давайте рассмотрим следующий фрагмент.

Здесь мы объявляем Строку с буквенно-цифровыми данными. Далее мы пытаемся использовать методы класса Integer wrapper для интерпретации этих данных как числовых.

Следовательно, это приводит к исключению NumberFormatException:

String str = "100ABCD";
int x = Integer.parseInt(str); // Throws NumberFormatException
int y = Integer.valueOf(str); //Throws NumberFormatException

4.5. Арифметическое исключение

Когда программа оценивает арифметическую операцию и она приводит к некоторому исключительному состоянию, она выдает ArithmeticException . Кроме того, ArithmeticException применяется только к типам данных int и long .

Например, если мы попытаемся разделить целое число на ноль, мы получим ArithmeticException :

int illegalOperation = 30/0; // Throws ArithmeticException

4.6. ClassCastException

Java позволяет осуществлять типизацию между объектами для поддержки наследования и полиморфизма. Мы можем либо поднять объект, либо опустить его.

При апкастинге мы приводим объект к его супертипу. И при понижении мы приводим объект к одному из его подтипов.

Однако во время выполнения, если код пытается понизить объект до подтипа, экземпляром которого он не является, метод вызывает ClassCastException .

Экземпляр среды выполнения-это то, что на самом деле имеет значение при типизации. Рассмотрим следующее наследование между Животное , Собака и Лев :

class Animal {}

class Dog extends Animal {}

class Lion extends Animal {}

Далее, в классе драйверов мы приводим ссылку Animal , содержащую экземпляр Lion , в Dog .

Однако во время выполнения JVM замечает, что экземпляр Lion не совместим с подтипом класса Dog .

Это приводит к ClassCastException:

Animal animal = new Lion(); // At runtime the instance is Lion
Dog tommy = (Dog) animal; // Throws ClassCastException

4.7. Исключение незаконных аргументов

Метод выбрасывает Исключение IllegalArgumentException если мы назовем это какими-то незаконными или неуместными аргументами.

Например, метод sleep() класса Thread ожидает положительного времени, и мы передаем отрицательный интервал времени в качестве аргумента. Это приводит к Исключение IllegalArgumentException :

Thread.currentThread().sleep(-10000); // Throws IllegalArgumentException

4.8. Исключение IllegalStateException

Исключение IllegalStateException сигнализирует о том, что метод был вызван в незаконное или неподходящее время.

Каждый объект Java имеет состояние (переменные экземпляра) и некоторое поведение (методы). Таким образом, IllegalStateException означает, что недопустимо вызывать поведение этого объекта с переменными текущего состояния.

Однако с некоторыми другими переменными состояния это может быть законно.

Например, мы используем итератор для итерации списка. Всякий раз, когда мы инициализируем один из них, он внутренне устанавливает свою переменную состояния lastRet в значение -1.

В этом контексте программа пытается вызвать метод remove в списке:

//Initialized with index at -1
Iterator intListIterator = new ArrayList<>().iterator(); 

intListIterator.remove(); // IllegalStateException

Внутренне метод remove проверяет переменную состояния lastRet , и если она меньше 0, он вызывает исключение IllegalStateException. Здесь переменная по-прежнему указывает на значение -1.

В результате мы получаем исключение IllegalStateException .

5. Заключение

В этой статье мы сначала обсудили, что такое исключения. исключение – это событие, которое происходит во время выполнения программы и нарушает нормальный поток инструкций программы.

Затем мы разделили исключения на Проверенные Исключения и Непроверенные исключения.

Далее мы обсудили различные типы исключений, которые могут возникать во время компиляции или во время выполнения.

Мы можем найти код для этой статьи на GitHub .