Укр
Вопросы на собеседованиях для начинающих Java разработчиков, часть 2

Вопросы на собеседованиях для начинающих Java разработчиков, часть 2

  • 20 июля, 2021
  • читать 10 мин

В продолжение первой части серии рассмотрим тему про Exception.

Exception:

  • Что такое исключение (Exception)

  • Какая иерархия исключений в Java

  • Какая разница между Error, Exception и RuntimeException

  • Как обработать исключения в Java

Рекомендуем публикацию по теме

Что такое исключение (Exception)

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

В Java исключения являются объектами и наследуются от класса Object.

Какая иерархия исключений в Java

Все исключения в Java наследуются от класса Throwable. Класс Throwable имеет два наследника — Error и Exception. Также есть RuntimeException, который наследуется от Exception. Когда идет речь об ошибках в Java, обычно имеют ввиду эти три класса: Error, Exception и RuntimeException. Все другие ошибки наследуются от этих классов.

Все исключения делятся на два типа: проверяемые исключения (checked) и непроверяемые исключения (unchecked).

Проверяемые исключения (checked) представляют собой ошибки, которые нужно обрабатывать в программе разработчику вручную. К этому типу относятся все потомки класса Exception (но не RuntimeException), а также класс Throwable.

Проверяемые исключения проверяются во время компиляции. Это означает, что на этапе компиляции компилятор проверяет, все ли проверяемые исключения были обработаны, если нет, то выдается ошибка компиляции.

Непроверяемые исключения (unchecked) представляют собой ошибки, которые не нужно обрабатывать вручную. К ним относятся классы Error и RuntimeException (наследник класса Exception) и их наследники. Это означает, что если программа генерирует непроверяемое исключение, и даже если вы не обрабатывали или не объявляли это исключение, программа не выдаст ошибку компиляции.

Рекомендуем курс по теме

Какая разница между Error, Exception и RuntimeException

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

Например, исключения такого рода возникают, если закончилась память, доступная виртуальной машине, и ловить такую ошибку не имеет смысла, так как JVM не сможет обеспечить дополнительную память. Наследуется от Throwable.

Далее перечислим несколько часто встречающихся наследников класса Error:

OutOfMemoryError — исключение возникает, когда не хватает памяти для создания новых объектов.

StackOverflowError — исключение возникает, когда происходит переполнение стека из-за глубокой рекурсии или отсутствии выхода из рекурсии.

NoClassDefFoundError — исключение возникает, когда приложение пытается загрузить класс. Например, создание нового объекта с использованием выражения «new».

Exception наследуется от Throwable. Exception и все его подклассы являются проверяемыми исключениями (checked), кроме RuntimeException.

Далее перечислим несколько часто встречающихся проверяемых (checked) исключений, которые наследуются от Exception:

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

Наследники: FileNotFoundException, UnsupportedEncodingException, EOFException, SocketException и т.д.

SQLException — базовый класс исключений, возникающих при работе с БД.

Наследники: SQLSyntaxErrorException, SQLFeatureNotSupportedException, SQLTimeoutException и т.д.

ClassNotFoundException — исключение возникает, когда приложение загружает класс через строковое имя (Class.forName, ClassLoader.findSystemClass, ClassLoader.loadClass)

RuntimeException наследуется от Exception. RuntimeException и все его подклассы являются непроверяемыми исключениями (unchecked).

Далее перечислим несколько часто встречающихся непроверяемых (unchecked) исключений, которые наследуются от RuntimeException:

NullPointerException — исключение, которое возникает при попытке использовать ссылку, которая не указывает ни на одно место в памяти (null). Вызов метода по ссылке null или попытка получить доступ к полю ссылки null вызовут NullPointerException. Один из самых часто встречающихся типов ошибок. Означает чаще всего ошибку разработчика.

ArithmeticException — исключение, которое возникает при ошибочных арифметических операциях. Например, деление на ноль или переполнение int, long и т.д.

ArrayIndexOutOfBoundsException — исключение, которое возникает при попытке доступа по недопустимому индексу в массиве. Индекс либо отрицательный, либо больше или равен размеру массива.

StringIndexOutOfBoundsException — исключение, которое возникает при попытке доступа по недопустимому индексу в строке. Индекс либо отрицательный, либо больше или равен размеру массива.

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

Как обработать исключения в Java

В Java есть пять ключевых слов для работы с исключениями: try, catch, finally, throw, throws.

Для обработки исключений используют конструкцию вида try...catch...finally и c Java 1.7 можно использовать конструкцию try-with-resources.

Первый способ:

try { 
//код, який може привести до помилки
} 
catch (Exception e ){  
//код, який обробляє виключення
} finally { 
//запускається в будь-якому випадку (блок finally не обов'язковий)
}

Первый способ не подходит для работы с ресурсами.

Второй способ:

try (OutputStream stream = openOutputStream()) {
    // щось робимо зі stream
}

try-with-resource можно использовать только над классами, которые наследуются от интерфейса Autoclosable. Это синтаксический сахар, компилятор во время компиляции превращает try-with-resource в обычный try-catch-finally и в блоке finally вызывает метод close у объекта, который указан в скобках после слова try.

В следующей части поговорим о Java Collections. Спасибо большое всем, кто дочитал )