Вопросы для собеседования по Java (серия) — исключения и ошибки
Все, что может пойти не так, пойдет не так!
🐞 Ошибки — это данность, когда дело доходит до разработки программного обеспечения.
Предотвратить их — это одно, но мы все знаем, что не можем предотвратить их все.
Вот почему обработка ошибок — это концепция, которую каждый хороший Java-разработчик должен понимать и уметь использовать.
💯 Это также причина, по которой вы найдете это в каждом интервью по Java.
В этом посте мы рассмотрим:
🔸 Что такое Error
?
🔸 Что такое Exception
?
🔸 Чем они отличаются от других?
🔸 Когда вы можете ожидать каждого из них?
🔸 Что попробовать обойти, а что оставить?
Давайте погрузимся в это! 🚀
Выбрасываемая иерархия
Как вы видете, Exception
а также Error
два разных класса, которые расширяют Throwable
.
В очереди, Throwable
расширяет Object
(мать всех классов в Java).
Узнайте больше подобных сообщений на новый всплеск и оставайтесь на вершине вашей игры интервью! 🚀
🔵 Исключение
Исключения — это проблемы, которые могут возникнуть в вашем приложении во время выполнения или во время компиляции.
Есть много, и я имею в виду много, уже определенных исключений Java. Но вы также можете определить свои собственные пользовательские. (На самом деле это хорошая практика.)
Вы можете найти исключения, разделенные на множество разных категорий, но большинство интервьюеров ожидают, что вы скажете:
🔸 проверил исключения
🔸 непроверенный исключения
🔷 Проверенные исключения
Эти checked
, согласно их имени, во время компиляции. Это означает, что если строка в методе вызывает одно из этих исключений, этот метод должен:
🔸 Справляйтесь.
🔸 Объявите в его сигнатуре, что это исключение ожидается, и следующий вызывающий метод должен его обработать.
Примеры проверил исключения:
🔸 IOException
— Сигналы о том, что операция ввода-вывода не удалась.
🔸 SQLException
— Предоставляет информацию о действиях БД, которые не удалось выполнить.
🔸 и др.
♻️ Пример
Скажем, мы хотим прочитать некоторые данные из файла.
Сначала нам нужно создать экземпляр FileInputStream
объект, которому мы передаем имя файла. Поскольку этот файл за это время может исчезнуть или мы можем указать неправильное имя, эта операция может завершиться неудачно.
Вот почему фактический конструктор FileInputStream
выдает проверенное исключение 😮 FileNotFoundException
.
public FileInputStream(String name) throws FileNotFoundException
FIleInputStream.java
Чтобы использовать его, как мы только что узнали, нам нужно либо обработать это исключение, либо передать его следующему вызывающему объекту нашего метода.
public void readBytes() throws FileNotFoundException { // add it in the signature
FileInputStream fis =new FileInputStream("test.txt");
...
}
ИЛИ ЖЕ
public void readBytesHandleException() {
try {
FileInputStream fin=new FileInputStream("D:\\testout.txt");
}
catch (FileNotFoundException exception) { // handle the exception
System.out.print("FileNotFoundException");
}
}
Узнайте больше подобных сообщений на новый всплеск и оставайтесь на вершине вашей игры интервью! 🚀
🔷 Непроверенное исключение
Как вы, наверное, догадались, такого рода исключения не проверяются во время компиляции, но могут появиться во время выполнения.
Из-за этого мы, как разработчики, должны заранее думать о том, что может пойти не так.
Примеры непроверенный исключения:
🔸 NullPointerException
— Указывает, что вы вызываете метод нулевого объекта.
🔸 ArithmeticException
— Возникает при возникновении исключительного арифметического условия.
🔸 и др.
♻️ Пример
Простым примером для этого является создание метода, который делит два числа, возвращая результат.
public double divide(double a, double b) {
return a/b;
}
🐞 Все развлечения и игры, пока клиент не решит пройти 0
в качестве второго аргумента.
🔥 А если вы помните из уроков математики, то при делении на ноль Вселенная взрывается. Поскольку мы пока не хотим, чтобы это произошло, нам нужен способ справиться с этим случаем.
public double divide(double a, double b) {
double result = 0;
try {
result = a/b;
}
catch (ArithmeticException exception) { // ArithmeticException is the exception thrown by the JVM when dividing by zero
System.out.print("ArithmeticException");
return 0;
}
return result;
}
Или, что еще лучше:
public double divide(double a, double b) {
if (b == 0) {
System.out.print("Division by zero!");
// throw your custom exception !
}
return a/b;
}
💯 главное преимущество обработки исключений заключается в том, что мы можем поддерживать работу приложения и корректно уведомлять клиента о том, что что-то пошло не так.
🔵 Ошибка
Error
класс также является дочерним классом Throwable
.
Он используется, чтобы сигнализировать о возникновении проблемы и приводит к завершению работы приложения.
Примеры Errors
:
🔸 OutOfMemoryError
— Возникает, когда виртуальная машина Java не может выделить объект из-за нехватки памяти.
🔸 NoClassDefFoundError
— Искомое определение класса существовало, когда выполняющийся в данный момент класс был скомпилирован, но определение больше не может быть найдено.
🔸 AssertionError
— Брошенный, чтобы указать, что утверждение не удалось.
♻️ Пример
Создание простого StackOverflowError
:
public static void stackOverflowError() {
while (true) {
stackOverflowError();
}
}
Выход :
Поскольку StackOverflowError
происходит от Throwable
вы все еще можете справиться с этим в течение try-catch
блокировать:
try {
stackOverflowError();
} catch (StackOverflowError error) {
System.out.println("Error caught!");
}
Иметь ввиду!
JVM выдает ошибки, чтобы указать на серьезные проблемы, от которых она не может восстановиться. такие как нехватка памяти и переполнение стека.
Вот почему в 99% случаев лучше не обращаться Errors
в try-catch block
и действительно выяснить причину этого.
Узнайте больше подобных сообщений на новый всплеск и оставайтесь на вершине вашей игры интервью! 🚀