предисловие
Обобщил десять основных моментов знаний об исключениях Java, которые пригодятся на собеседованиях или в работе.
1. Что такое исключение
Исключение — это проблема, которая препятствует продолжению выполнения текущего метода или области видимости.. Например, файл, который вы читаете, не существует, массив выходит за границы, а деление на 0 вызовет исключение.
Одинисключение файл не найден:
public class TestException {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("jaywei.txt");
int b;
while ((b = is.read()) != -1) {
}
}
}
результат операции:
Exception in thread "main" java.io.FileNotFoundException: jaywei.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at exception.TestException.main(TestException.java:10)
2. Иерархия исключений
Жил-был старик по имениThrowable, он родил двух сыновей, старшего сына назвалиError, второго сына зовутException.
Error
Указывает на ошибки времени компиляции или системные ошибки, такие как ошибки, связанные с виртуальной машиной, OutOfMemoryError и т. д., ошибки не могут быть обработаны.
Exception
Исключение кода, базовый тип, о котором заботятся программисты Java, обычно является Exception. Она может быть обработана самой программой, в чем разница между ней и ошибкой.
Его можно разделить на RuntimeException (исключение времени выполнения) и CheckedException (проверяемое исключение).
Общие исключения RuntimeException:
- NullPointerException 空指针异常
- ArithmeticException 出现异常的运算条件时,抛出此异常
- IndexOutOfBoundsException 数组索引越界异常
- ClassNotFoundException 找不到类异常
- IllegalArgumentException(非法参数异常)
Исключения общих проверенных исключений:
- IOException (操作输入流和输出流时可能出现的异常)
- ClassCastException(类型转换异常类)
- Checked Exception — это исключение, которое компилятор требует от вас обработки.
- Напротив, Unchecked Exceptions, которые относятся к исключениям, которые компилятор не требует принудительной обработки, включают Error и RuntimeException и их подклассы.
3. Обработка исключений
Когда возникает исключение, в куче создается объект исключения. Текущий путь выполнения завершается, и ссылка на объект исключения извлекается из текущей среды. В этот моментОбработка исключенийпрограмму, чтобы программа вышла из состояния ошибки, чтобы программа продолжала работать.
Обработка исключений в основном включает создание исключений, перехват исключений и объявление исключений. Как показано на рисунке:
поймать исключение
try{
// 程序代码
}catch(Exception e){
//Catch 块
}finaly{
//无论如何,都会执行的代码块
}
мы можем пройтиtry...catch...
Перехватите код исключения, а затем передайтеfinaly
Выполнение заключительных операций, таких как закрытие потока и т. д.
объявить исключение броска
Кромеtry...catch...
Чтобы перехватывать исключения, мы также можем генерировать исключения с помощью оператора throws.
Когда вы определяете метод, вы можете использоватьthrows
объявление ключевого слова. использовалthrows
Ключевое слово указывает, что метод не обрабатывает исключения, а оставляет их для обработки вызывающей стороне. Считаете ли вы, что ТА безответственна?
Ха-ха, взгляните на демо
//该方法通过throws声明了IO异常。
private void readFile() throws IOException {
InputStream is = new FileInputStream("jaywei.txt");
int b;
while ((b = is.read()) != -1) {
}
}
Любое исключение, объявленное для вызова из метода, должно использовать предложение throws.
Выбросить исключение
Функция ключевого слова throw состоит в том, чтобы броситьThrowable
Тип исключения, которое обычно возникает в теле функции. При обработке исключений оператору try необходимо захватить объект исключения, фактически объект исключения также может быть сгенерирован сам по себе.
Например, сгенерируйте объект исключения класса RuntimeException:
throw new RuntimeException(e);
Любой код Java может генерировать исключения с помощью оператора throw Java.
будь осторожен
- Непроверенные исключения (Error, RuntimeException или их подклассы) не могут использовать ключевое слово throws для объявления исключения, которое нужно выбросить.
- Когда в методе возникает исключение времени компиляции, его необходимо обрабатывать с помощью try-catch/throws, иначе это вызовет ошибку компиляции.
В-четвертых, последовательность выполнения try-catch-finally-return
описание выполнения try-catch-finally-return
- Если исключения не возникнет, часть catch не будет выполнена.
- Независимо от того, возникнет ли исключение, finally будет выполнен.
- наконец, все еще выполняется, даже если есть возврат в попытке и поймать
- finally выполняется после вычисления выражения, следующего за return. (В это время значение после операции не возвращается, но значение, которое должно быть возвращено, сохраняется первым. Если нет возврата в finally, независимо от того, какой код в finally, возвращаемое значение не изменится, это все еще сохраняется перед.значением), и в этом случае возвращаемое значение функции определяется перед окончательным выполнением)
- Не возвращайте часть finally, иначе вы не сможете вернуться к возврату try или catch.
посмотреть пример
public static void main(String[] args) throws IOException {
System.out.println("result:" + test());
}
private static int test() {
int temp = 1;
try {
System.out.println("start execute try,temp is:"+temp);
return ++temp;
} catch (Exception e) {
System.out.println("start execute catch temp is: "+temp);
return ++temp;
} finally {
System.out.println("start execute finally,temp is:" + temp);
++temp;
}
}
результат операции:
start execute try,temp is:1
start execute finally,temp is:2
result:2
анализировать
- Сначала выполните часть попытки, выведите журнал и выполните
++temp
выражение, temp становится равным 2, и это значение сохраняется. - Поскольку исключения не возникло, блок catch пропускается.
- Выполнить блок finally, вывести журнал, выполнить
++temp
выражение. - Возвращает значение 2, хранящееся в разделе try.
Пять, несколько важных методов класса исключений Java
Во-первых, давайте взглянем на все методы класса исключений, как показано ниже:
getMessage
Returns the detail message string of this throwable.
getMessage вернет ThrowabledetailMessage
свойства, при этомdetailMessage
Подробное описание сообщения, указывающее, что произошло исключение.
Например,FileNotFoundException
Когда возникает исключение, этоdetailMessage
Он содержит имя файла, который не может быть найден.
getLocalizedMessage
Creates a localized description of this throwable.Subclasses may override this
method in order to produce alocale-specific message. For subclasses that do not
override thismethod, the default implementation returns the same result
as getMessage()
Локализованное описание throwable. Подклассы могут переопределить этот метод для создания сообщений, зависящих от локали. Для подклассов, которые не переопределяют этот метод, реализация по умолчанию возвращает тот же результат, что и getMessage().
getCause
Returns the cause of this throwable or null if thecause is nonexistent or unknown.
Возвращает причину этого броска или null, если причина не существует или неизвестна.
printStackTrace
Prints this throwable and its backtrace to thestandard error stream.
The first line of output contains the result of the toString() method for
this object.Remaining lines represent data previously recorded by the
method fillInStackTrace().
Этот метод выводит информацию о трассировке стека в стандартный поток ошибок.
Первая строка вывода содержит результат метода toString() этого объекта. Остальные строки представляют собой данные, ранее записанные методом fillInStackTrace(). Следующий пример:
java.lang.NullPointerException
at MyClass.mash(MyClass.java:9)
at MyClass.crunch(MyClass.java:6)
at MyClass.main(MyClass.java:3)
Шесть, пользовательское исключение
Пользовательское исключение обычно определяется как подкласс, наследуемый от класса Exception.
Итак, зачем вам пользовательские исключения?
- Система исключений, предоставляемая Java, не может предвидеть все ошибки.
- В бизнес-разработке использование пользовательских исключений может сделать код проекта более стандартизированным и простым в управлении.
Ниже приведена простая демонстрация нашего пользовательского класса исключений.
public class BizException extends Exception {
//错误信息
private String message;
//错误码
private String errorCode;
public BizException() {
}
public BizException(String message, String errorCode) {
this.message = message;
this.errorCode = errorCode;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
}
Запустите основную вечеринку для тестирования
public class TestBizException {
public static void testBizException() throws BizException {
System.out.println("throwing BizException from testBizException()");
throw new BizException("100","哥,我错了");
}
public static void main(String[] args) {
try {
testBizException();
} catch (BizException e) {
System.out.println("自己定义的异常");
e.printStackTrace();
}
}
}
результат операции:
exception.BizException: 100
throwing BizException from testBizException()
自己定义的异常
at exception.TestBizException.testBizException(TestBizException.java:7)
at exception.TestBizException.main(TestBizException.java:12)
Семь, новый оператор try-with-resources в Java7
try-with-resources, новая функция, предоставляемая Java7, используется для автоматического управления ресурсами.
- Ресурс — это объект, который должен быть закрыт после того, как программа израсходована.
- try-with-resources гарантирует, что каждый объявленный ресурс будет закрыт в конце оператора
- Какие объекты можно использовать в качестве ресурсов? Пока объект, реализующий интерфейс java.lang.AutoCloseable или интерфейс java.io.Closeable, в порядке.
существуетtry-with-resources
перед появлением
try{
//open resources like File, Database connection, Sockets etc
} catch (FileNotFoundException e) {
// Exception handling like FileNotFoundException, IOException etc
}finally{
// close resources
}
Java7,try-with-resources
После появления используйте ресурс для достижения
try(// open resources here){
// use resources
} catch (FileNotFoundException e) {
// exception handling
}
// resources are closed as soon as try-catch block is executed.
Java7 использует демонстрацию ресурсов
public class Java7TryResourceTest {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader(
"C:/jaywei.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
использовалtry-with-resources
преимущества
- Код стал более элегантным и содержит меньше строк.
- Автоматическое управление ресурсами, не нужно беспокоиться об утечках памяти.
8. Цепочка исключений
Мы часто хотим сгенерировать исключение после перехвата другого и хотим сохранить информацию об исходном исключении, которое называетсяцепочка исключений.
throw
Выбрасывается новая информация об исключении, которая приведет к потере исходной информации об исключении. До JDk1.4 программистам приходилось писать собственный код для сохранения исходной информации об исключении. теперь всеThrowable
Подклассы могут приниматьcause(异常因由)
объект в качестве параметра.
этоcause
Он используется для представления исходного исключения, поэтому, передавая исходное исключение новому исключению, даже если новое исключение создается и выдается в текущем местоположении, цепочка исключений может быть прослежена до исходного расположения исключения.
Он используется следующим образом:
public class TestChainException {
public void readFile() throws MyException{
try {
InputStream is = new FileInputStream("jay.txt");
Scanner in = new Scanner(is);
while (in.hasNext()) {
System.out.println(in.next());
}
} catch (FileNotFoundException e) {
//e 保存异常信息
throw new MyException("文件在哪里呢", e);
}
}
public void invokeReadFile() throws MyException{
try {
readFile();
} catch (MyException e) {
//e 保存异常信息
throw new MyException("文件找不到", e);
}
}
public static void main(String[] args) {
TestChainException t = new TestChainException();
try {
t.invokeReadFile();
} catch (MyException e) {
e.printStackTrace();
}
}
}
//MyException 构造器
public MyException(String message, Throwable cause) {
super(message, cause);
}
результат операции:
Мы видим, что информация об исключении была сохранена.Если причина (то есть e из FileNotFoundException) удалена, взгляните на текущий результат:
можно найти, меньшеThrowable cause
, исходная информация об аномалии исчезла.
Девять, ненормальное совпадение
Когда возникает исключение, система обработки исключений находит «ближайший» обработчик в том порядке, в котором был написан код. Как только он находит подходящий обработчик, он считает, что исключение будет обработано, и не смотрит дальше.
Поиск не требует, чтобы созданное исключение точно соответствовало исключению обработчика. Объекты производных классов также могут быть снабжены обработчиками своих базовых классов.
посмотреть демо
package exceptions;
//: exceptions/Human.java
// Catching exception hierarchies.
class Annoyance extends Exception {}
class Sneeze extends Annoyance {}
public class Human {
public static void main(String[] args) {
// Catch the exact type:
try {
throw new Sneeze();
} catch(Sneeze s) {
System.out.println("Caught Sneeze");
} catch(Annoyance a) {
System.out.println("Caught Annoyance");
}
// Catch the base type:
try {
throw new Sneeze();
} catch(Annoyance a) {
System.out.println("Caught Annoyance");
}
}
}
результат операции:
catch(Annoyance a) будет перехватывать раздражение и все производные от него исключения. Поймайте исключение базового класса, вы можете сопоставить исключение всех производных классов
try {
throw new Sneeze();
} catch(Annoyance a) {
} catch(Sneeze s) { //这句编译器会报错,因为异常已由前面catch子句处理
}
10. Распространенные исключения в Java
NullPointerException
Исключение нулевого указателя, наиболее распространенный класс исключений. Короче говоря, это исключение генерируется при вызове неинициализированного объекта или несуществующего объекта.
ArithmeticException
Класс арифметического исключения, такое исключение возникает, когда в программе происходит такая операция, как деление на 0.
ClassCastException
Исключение приведения типов, которое является исключением времени выполнения, вызываемым JVM при обнаружении несовместимости преобразования между двумя типами.
ArrayIndexOutOfBoundsException
Исключение индекса массива вне границ, при работе с массивами вам нужно обратить внимание на это исключение.
FileNotFoundException
Исключение File not found, как правило, файл для чтения или записи не может быть найден, что вызывает это исключение.
SQLException
Исключение базы данных операции, это Checked Exception;
IOException
Исключения ввода-вывода обычно тесно связаны с чтением и записью файлов, и они также являются проверенными исключениями. Обычно читают и пишут файлы, не забудьте закрыть поток ввода-вывода!
NoSuchMethodException
Метод не найден, исключение
NumberFormatException
Исключение из строки в число
Суммировать
Этот краткий обзор уникален и заканчивается несколькими классическими нестандартными вопросами для интервью, которые помогут каждому проанализировать, хи-хи.
- Каковы типы исключений Java и каковы их характеристики? (Можно ответить на пункт знаний 2)
- Что такое исключения в Java? (Очки знаний можно ответить)
- В чем разница между errorи exception? (Можно ответить на пункт знаний 2)
- Что такое цепочка исключений? (Можно ответить на восьмой пункт знания)
- порядок выполнения try-catch-finally-return (можно ответить на пункт знаний 4)
- Перечислите несколько распространенных исключений RunException (можно ответить на второй пункт знаний)
- Каковы важные методы класса исключений Java? (Можно ответить на пункт 5 знаний)
- Разница между ошибкой и исключением, CheckedException, разница RuntimeException. (Можно ответить на пункт знаний 2)
- Укажите 5 исключений во время выполнения. (Можно ответить на пункт знаний 2)
- Новый оператор try-with-resources в Java 7 (можно ответить на седьмой пункт знаний)
- Как настроить исключение? (Можно ответить на пункт 6 знаний)
- Расскажите о распространенных аномалиях и их причинах (можно ответить на десять баллов знаний)
- Расскажите об аномальном совпадении (можно ответить на девятый пункт знаний)
- Поговорите об обработке исключений (можно ответить на третий пункт знаний)
Личный публичный аккаунт
- Если вы хороший ребенок, который любит учиться, вы можете подписаться на мой официальный аккаунт, чтобы вместе учиться и обсуждать.
- Если вы считаете, что в этой статье есть какие-либо неточности, вы можете прокомментировать или подписаться на мой официальный аккаунт, пообщаться со мной в частном порядке, и все смогут учиться и прогрессировать вместе.