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

Распространенные исключения Java

1. Вступление

В этом руководстве рассматриваются некоторые распространенные исключения Java.

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

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

An exception is an abnormal condition that occurs in a code sequence during the execution of a program. Это ненормальное состояние возникает, когда программа нарушает определенные ограничения во время выполнения.

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

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

Checked exceptions are mandatory to handle. Это прямые подклассы классаException.

Естьdebate об их важности, на которые стоит обратить внимание.

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

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. ParseExceptionс

Java использует синтаксический анализ текста для создания объекта на основе заданногоString.If parsing causes an error, it throws a ParseException.

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

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

ЗдесьString искажен и вызываетParseException.

3.3. InterruptedExceptionс

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

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

Следовательно,the thread throws an InterruptedException if another thread interrupts it while it is in the WAITING or in the TIMED_WAITING state.

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

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

  • Дочерний поток запускается и вызывает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. Непроверенные исключения

For Unchecked Exceptions, the compiler doesn’t check during the compilation process. Следовательно, метод не является обязательным для обработки этих исключений.

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

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

4.1. NullPointerExceptionс

Если приложение пытается использоватьnull там, где ему действительно требуется экземпляр объекта, метод выдаст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с

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

Однако, if a piece of code tries to access an illegal index of an array, the respective method throws an ArrayIndexOutOfBoundException.

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

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.. Когда мы используем эти методы, он внутренне преобразуетString в массив символов.

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

Это исключениеindicates that the index is either greater than or equal to the size of the String. StringIndexOutOfBoundsException расширяетIndexOutOfBoundsException.

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

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с

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

Однакоif the String doesn’t have an appropriate format during the conversion, the method throws a NumberFormatException.

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

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

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

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

4.5. ArithmeticExceptionс

When a program evaluates an arithmetic operation and it results in some exceptional condition, it throws ArithmeticException. Кроме того,ArithmeticException применяется только к типам данныхint andlong.

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

int illegalOperation = 30/0; // Throws ArithmeticException

4.6. ClassCastExceptionс

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

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

Однакоat runtime, if the code attempts to downcast an object to a subtype of which it isn’t an instance, the method throws a ClassCastException.

Экземпляр времени выполнения - это то, что действительно имеет значение при приведении типов. Рассмотрим следующее наследование междуAnimal,Dog, and Lion:

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с

Метод выдает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. Заключение

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

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

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

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