Краткое изложение интервью по Java, включая ключевые знания Java и общие платформы с открытым исходным кодом, приветствуется к прочтению. В статье возможны ошибки, т.к. личные знания ограничены, прошу указать! Статья постоянно обновляется...
ID заглавие адрес 1 Дизайн шаблонов Вопросы собеседования (сводка самых полных вопросов собеседования) nuggets.capable/post/684490… 2 Вопросы для собеседования по базовым знаниям Java (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 3 Вопросы для собеседования по коллекции Java (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 4 Вопросы для интервью JavaIO, BIO, NIO, AIO, Netty (резюме наиболее полных вопросов для интервью) nuggets.capable/post/684490… 5 Вопросы для собеседования по параллельному программированию на Java (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 6 Вопросы для собеседования об исключении Java (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 7 Вопросы для интервью с виртуальной машиной Java (JVM) (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 8 Весенние вопросы для интервью (резюме наиболее полных вопросов для интервью) nuggets.capable/post/684490… 9 Вопросы интервью Spring MVC (сводка наиболее полных вопросов интервью) nuggets.capable/post/684490… 10 Вопросы интервью Spring Boot (сводка наиболее полных вопросов интервью) nuggets.capable/post/684490… 11 Вопросы интервью Spring Cloud (краткое изложение наиболее полных вопросов интервью) nuggets.capable/post/684490… 12 Вопросы интервью Redis (сводка наиболее полных вопросов интервью) nuggets.capable/post/684490… 13 Вопросы для интервью MyBatis (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 14 Вопросы для собеседования по MySQL (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 15 TCP, UDP, Socket, HTTP вопросы интервью (резюме наиболее полных вопросов интервью) nuggets.capable/post/684490… 16 Вопросы для интервью с Nginx (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 17 ElasticSearch Вопросы на собеседовании 18 кафка вопросы интервью 19 Вопросы для интервью RabbitMQ (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 20 Вопросы интервью Dubbo (сводка самых полных вопросов собеседования) nuggets.capable/post/684490… 21 Вопросы интервью ZooKeeper (резюме наиболее полных вопросов интервью) nuggets.capable/post/684490… 22 Вопросы для интервью Netty (краткое изложение наиболее полных вопросов для интервью) 23 Вопросы для интервью с Tomcat (сводка наиболее полных вопросов для интервью) nuggets.capable/post/684490… 24 Вопросы для собеседования по Linux (сводка наиболее полных вопросов для собеседования) nuggets.capable/post/684490… 25 Вопросы для интервью, связанные с Интернетом (краткое изложение наиболее полных вопросов для интервью) 26 Вопросы для интервью по безопасности в Интернете (краткое изложение наиболее полных вопросов для интервью)
Архитектура исключений Java и ключевые слова исключений
Введение в исключения Java
- Исключение Java — это согласованный механизм, предоставляемый Java для выявления ошибок и реагирования на них.
Механизм исключения Java может отделить код обработки исключений в программе из обычного бизнес-кода, убедитесь, что программный код более элегантна, и улучшить надежность программы. При эффективном использовании исключения могут четко ответить на три вопроса того, что, где, и почему: тип исключения отвечает «Что» было брошено, исключение стека следования ответов «где» было брошено, а исключение информации отвечает «Почему» бросает Отказ
Архитектура исключений Java
1. Throwable
-
Throwable — это суперкласс для всех ошибок и исключений в языке Java.
-
Throwable содержит два подкласса: Error (ошибка) и Exception (исключение), которые обычно используются для обозначения того, что произошло ненормальное состояние.
-
Throwable содержит моментальный снимок стека выполнения потока при его создании и предоставляет интерфейсы, такие как printStackTrace(), для получения данных трассировки стека и другой информации.
2. Ошибка
-
определение: класс Error и его подклассы. Ошибка, которую программа не может обработать, указывающая на серьезную ошибку при запуске приложения.
-
Функции: эти ошибки обычно указывают на проблему с JVM во время выполнения кода. Обычно это Virtual MachineError (ошибка запуска виртуальной машины), NoClassDefFoundError (ошибка определения класса) и так далее. Например, OutOfMemoryError: ошибка нехватки памяти; StackOverflowError: ошибка переполнения стека. При возникновении такой ошибки JVM завершит поток.
-
Эти ошибки являются непроверенными исключениями, ошибками, не связанными с кодированием. Поэтому при возникновении таких ошибок приложения не должны обрабатывать такие ошибки. Согласно соглашению Java, мы не должны реализовывать новый подкласс Error!
3. Исключение
- Исключение, которое может поймать и обработать сама программа. Исключение Этот вид исключения делится на две категории: исключение времени выполнения и исключение времени компиляции.
исключение времени выполнения
-
определение: Класс RuntimeException и его подклассы представляют исключения, которые могут возникать во время выполнения JVM.
-
Функции: Компилятор Java не проверяет. То есть, когда в программе может возникнуть такое исключение, если оно не «выбрасывает его через оператор throws» и не «перехватывает его с помощью оператора try-catch», оно все равно будет компилироваться. Например, исключение нулевого указателя NullPointerException, исключение индекса массива ArrayIndexOutBoundException за пределами границ, исключение преобразования типа ClassCastException, арифметическое исключение ArithmeticExecption. Такие исключения являются непроверенными исключениями, обычно вызванными логическими ошибками программы, которые могут быть перехвачены или не обработаны в программе. Хотя компилятор Java не проверяет исключения во время выполнения, мы также можем объявлять броски с помощью throws и перехватывать их с помощью try-catch. Если возникает исключение во время выполнения, вам необходимо изменить код, чтобы избежать его. Например, если происходит деление на ноль, вам нужен код, чтобы этого избежать!
-
Исключения RuntimeException автоматически создаются и автоматически перехватываются виртуальной машиной Java (Даже если мы не напишем оператор перехвата исключения, среда выполнения выдаст ошибку! ! ), подавляющее большинство возникновения таких исключений заключается в том, что есть проблема с самим кодом, которую надо решить логически и доработать код.
исключение времени компиляции
-
определение: Исключение в Exception, отличное от RuntimeException и его подклассов.
-
Функции: Компилятор Java проверит это. Если в программе возникает такое исключение, как ClassNotFoundException (указанное исключение класса не найдено), IOException (исключение IO-потока), его можно либо объявить и выбросить через throws, либо поймать и обработать через try-catch, в противном случае оно не может быть скомпилирован. В программе этот тип исключения обычно не настраивается, а напрямую используется класс исключения, предоставляемый системой.Это исключение мы должны вручную добавить оператор catch в код для обработки исключения.
4. Проверенные исключения и непроверенные исключения
- Все Исключение Java можно разделить на субъекты ненормальным (проверенным исключением) и незаменимыми исключениями (незаменимое исключение).
проверенное исключение
- Компилятору требуются исключения, которые необходимо обрабатывать. В процессе работы правильной программы она часто подвержена нештатным ситуациям, которые оправдывают ожидания. Как только возникает такое исключение, его необходимо каким-то образом обработать.За исключением RuntimeException и его подклассов, все остальные исключения Exception являются проверенными исключениями.. Компилятор проверит наличие таких исключений, то есть, когда компилятор обнаружит, что где-то в приложении могут быть такие исключения, он предложит вам обработать исключение — либо использовать try-catch для его перехвата, либо использовать в сигнатура метода.Ключевое слово throws throws, иначе компиляция завершится ошибкой.
непроверенное исключение
- Компилятор не проверяет и не требует исключений, которые необходимо обрабатывать, а это значит, что при возникновении такого исключения в программе, даже если мы его не пытаемся поймать, и не используем броски для выбрасывания исключения, компиляция пройдет нормально .Этот кластер аномалий, включая ненормальный (runtimeexception чрезвычайно подкласс) и ошибка времени выполнения (ошибка).
Ключевое слово исключения Java
- try– для мониторинга. Поместите отслеживаемый код (код, который может генерировать исключение) внутри блока try, и когда в блоке try возникает исключение, оно генерируется.
- catch– для отлова исключений. catch используется для перехвата исключений, возникающих в блоке try.
- finally– Блок finally выполняется всегда. В основном он используется для повторного использования физических ресурсов (таких как соединения с базой данных, сетевые соединения и файлы на диске), открытых в блоках try. Только блок finally после завершения выполнения вернется для выполнения оператора return или throw в блоке try или catch.Если в блоке finally используется оператор метода завершения, такой как return или throw, он не вернется назад к выполнению и остановке непосредственно.
- throw– для генерирования исключений.
- throws– Используется в сигнатурах методов для объявления исключений, которые может генерировать метод.
Обработка исключений Java
-
Java обрабатывает исключения через объектно-ориентированные методы. После того, как метод выбрасывает исключение, система автоматически находит подходящий обработчик исключения (обработчик исключения) в соответствии с объектом исключения для обработки исключений, классифицирует различные исключения и обеспечивает хороший интерфейс. В Java каждое исключение является объектом, который является экземпляром изготавливания или его подклассов. Когда исключение происходит в способе метода, объект исключения брошен, и объект содержит информацию о исключительной информации. Способ вызова этого объекта может получить исключение и обработать его. Обработка исключений в Java осуществляется через пять ключевых слов: попробуйте, поймать, бросить, бросать и наконец.
-
В приложениях Java механизм обработки исключений разделен на объявление исключений, создание исключений и перехват исключений.
объявить исключение
- В общем, вы должны перехватывать исключения, которые вы знаете, как обрабатывать, и передавать исключения, которые вы не знаете, как обрабатывать. Передача исключений может использоваться в сигнатурах методов.throwsКлючевое слово объявляет исключения, которые могут быть выброшены.
Уведомление
- Непроверенные исключения (Error, RuntimeException или их подклассы) не могут использовать ключевое слово throws для объявления исключения, которое нужно выбросить.
- Когда в методе возникает исключение времени компиляции, его необходимо обрабатывать с помощью try-catch/throws, иначе это вызовет ошибку компиляции.
Выбросить исключение
-
Если вы чувствуете, что некоторые проблемы с исключениями не могут быть решены и не требуют обработки вызывающим кодом, вы можете генерировать исключения.
-
Функция ключевого слова throw состоит в том, чтобы бросить
Throwable
тип исключения. Любой код Java может вызвать исключение с помощью оператора throw.
поймать исключение
- Программы вообще не запускаются до отдачи, но после операции может возникнуть какая-то неизвестная ошибка, но тоже не хочет выбрасывать сразу на верхний уровень, нужно захватить нештатную форму try...catch... а затем в зависимости от аномалии, где выполняется соответствующая обработка.
Как выбрать тип исключения
- Вы можете выбрать, следует ли перехватывать исключение, объявлять исключение или генерировать исключение в соответствии со следующим рисунком.
Общие методы обработки исключений
бросать исключение напрямую
- В общем, вы должны перехватывать исключения, которые вы знаете, как обрабатывать, и передавать исключения, которые вы не знаете, как обрабатывать. Передача исключений может использоваться в сигнатурах методов.throwsКлючевое слово объявляет исключения, которые могут быть выброшены.
private static void readFile(String filePath) throws IOException {
File file = new File(filePath);
String result;
BufferedReader reader = new BufferedReader(new FileReader(file));
while((result = reader.readLine())!=null) {
System.out.println(result);
}
reader.close();
}
Исключения из пакета
- Иногда мы выбрасываем исключение из catch, чтобы изменить тип исключения. Он в основном используется при интеграции нескольких систем.При сбое подсистемы может быть несколько типов исключений, которые могут быть представлены унифицированным типом исключения без раскрытия слишком большого количества внутренних сведений об исключении.
private static void readFile(String filePath) throws MyException {
try {
// code
} catch (IOException e) {
MyException ex = new MyException("read file failed.");
ex.initCause(e);
throw ex;
}
}
поймать исключение
- В блоке try-catch может быть перехвачено несколько типов исключений, и разные типы исключений могут обрабатываться по-разному.
private static void readFile(String filePath) {
try {
// code
} catch (FileNotFoundException e) {
// handle FileNotFoundException
} catch (IOException e){
// handle IOException
}
}
- Один и тот же catch может также перехватывать несколько типов исключений, разделенных символом |
private static void readFile(String filePath) {
try {
// code
} catch (FileNotFoundException | UnknownHostException e) {
// handle FileNotFoundException or UnknownHostException
} catch (IOException e){
// handle IOException
}
}
пользовательское исключение
- По соглашению определение класса исключения должно содержать два конструктора: конструктор без аргументов и конструктор с подробным описанием (метод toString класса Throwable выводит эти сведения, что полезно при отладке).
public class MyException extends Exception {
public MyException(){ }
public MyException(String msg){
super(msg);
}
// ...
}
try-catch-finally
- Когда исключение происходит в методе, код после исключения не будет выполнен. Если некоторые локальные ресурсы были приобретены до и необходимо выпустить, код для освобождения локальных ресурсов должен быть вызван при нормальном конце метода И в выявлении Catch, который делает код более громоблоком. Заявление о последнее время может решить эту проблему.
private static void readFile(String filePath) throws MyException {
File file = new File(filePath);
String result;
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
while((result = reader.readLine())!=null) {
System.out.println(result);
}
} catch (IOException e) {
System.out.println("readFile method catch block.");
MyException ex = new MyException("read file failed.");
ex.initCause(e);
throw ex;
} finally {
System.out.println("readFile method finally block.");
if (null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
-
При вызове этого метода при прочтении файла возникает исключение, код будет вводит блок CATH CODE, а затем введите блок наконец-токового кода; если исключение не происходит при чтении файла, он будет пропустить блокировку кода Catch и введите Наконец-то код код напрямую. Таким образом, код в Fianlly будет выполнять, возникает ли исключение в коде.
-
Если блок catch содержит оператор return, будет ли выполняться код finally? Измените предложение catch в приведенном выше коде следующим образом:
catch (IOException e) {
System.out.println("readFile method catch block.");
return;
}
- Вызовите метод readFile и посмотрите, выполняется ли предложение finally при вызове оператора return в предложении catch.
readFile method catch block.
readFile method finally block.
- Видно, что даже если оператор return включен в catch, предложение finally все равно будет выполнено. Если finally также содержит оператор return, возврат в finally переопределяет предыдущий возврат.
try-with-resource
- В приведенном выше примере метод close в finally также может генерировать исключение IOException, переопределяя исходное исключение. JAVA 7 предоставляет более элегантный способ реализации автоматического освобождения ресурсов.Автоматически освобождаемые ресурсы должны быть классами, реализующими интерфейс AutoCloseable.
private static void tryWithResourceTest(){
try (Scanner scanner = new Scanner(new FileInputStream("c:/abc"),"UTF-8")){
// code
} catch (IOException e){
// handle exception
}
}
- Когда блок кода try завершается, автоматически вызывается метод scan.close. Отличие от размещения метода scan.close в блоке кода finally заключается в том, что если scan.close выдает исключение, оно будет подавлено, а исходное исключение будет удалено. все равно кинут.. Подавленное исключение будет добавлено к исходному исключению с помощью метода addSusppressed.Если вы хотите получить список подавленных исключений, вы можете вызвать метод getSuppressed, чтобы получить его.
Общие вопросы интервью об исключении Java
1. Ошибка и исключение В чем разница?
-
Ошибки типа Error обычно связаны с ошибками виртуальной машины, такими как сбой системы, нехватка памяти, переполнение стека и т. д. Компилятор не обнаружит такие ошибки, и приложения JAVA не должны фиксировать такие ошибки. завершено и не может быть восстановлено самим приложением;
-
Ошибки класса Exception могут быть перехвачены и обработаны в приложении, и такие ошибки обычно встречаются и должны обрабатываться, чтобы приложение могло продолжать нормально работать.
2. В чем разница между исключениями времени выполнения и общими исключениями (проверяемыми исключениями)?
-
Исключения времени выполнения включают класс RuntimeException и его подклассы, которые представляют исключения, которые могут возникать во время выполнения JVM. Компилятор Java не проверяет исключения во время выполнения.
-
Проверяемое исключение — это исключение в Exception, отличное от RuntimeException и его подклассов. Компилятор Java проверяет проверенные исключения.
-
Разница между RuntimeException и проверенным исключением: Обязательный вызывающий объект должен обрабатывать это исключение, обязательный, если вызывающий объект должен быть обработан, затем используйте субъектные исключения, в противном случае выберите Непроверенные исключения (RuntimeException). Вообще говоря, если нет особых требований, мы рекомендуем использовать RuntimeException.
3. Как JVM обрабатывает исключения?
-
Если в методе возникает исключение, метод создает объект исключения и передает его JVM, объект исключения содержит имя исключения, описание исключения и состояние приложения на момент возникновения исключения. Процесс создания объекта исключения и передачи его JVM называется созданием исключения. Перед окончательным входом в метод, выбрасывающий исключение, может быть серия вызовов методов.Упорядоченный список этой серии вызовов методов называется стеком вызовов.
-
JVM перейдет в счет взыскания, чтобы узнать, есть ли код, который может обрабатывать исключения, если есть, вызовите код обработки исключений. Когда обнаруживает JVM, может обрабатывать код исключения, исключение происходит к нему. Если JVM не находит блок кода, который может обрабатывать исключение, JVM будет передавать исключение к процессору исключений по умолчанию (часть процессора по умолчанию является частью JVM), процессор исключений по умолчанию распечатывает информацию об исключении и завершается приложение.
4. В чем разница между броском и броском?
- В дополнение к перехвату и обработке исключений обработка исключений в Java также включает объявление и генерацию исключений.Вы можете объявить исключение, которое будет генерироваться методом в методе с помощью ключевого слова throws, или генерировать исключение с помощью throw внутри объекта метода.
Различия между ключевым словом броска и ключевым словом броска следующие следующие:
- Ключевое слово throw используется внутри метода и может использоваться для создания исключения только одного типа. Оно используется для создания исключений в методе или блоке кода. Могут быть созданы как проверенные, так и непроверенные исключения.
- Ключевое слово throws используется в объявлениях методов, которые могут генерировать несколько исключений, чтобы указать список исключений, которые может генерировать метод. Метод использует throws для определения списка исключений, которые могут быть выброшены.Метод, вызывающий метод, должен содержать код, который может обрабатывать исключение, в противном случае соответствующее исключение должно быть объявлено с помощью ключевого слова throws в сигнатуре метода.
5. В чем разница между финалом, наконец и доработана?
- Final может изменять классы, переменные и методы.Измененный класс означает, что класс не может быть унаследован, модифицированный метод означает, что метод нельзя переопределить, а измененная переменная означает, что переменная является константой и не может быть переназначена.
- Наконец, обычно действует в блоке кода try-catch.При работе с исключениями мы обычно помещаем метод кода, который должен быть выполнен, в блоке кода finally, указывая, что блок кода будет выполняться независимо от того, есть исключение или нет, и обычно используется для хранения некоторых закрытых ресурсов кода.
- Finalize — это метод, принадлежащий методу класса Object, а класс Object — это всевозможные родительские классы.Java позволяет методу Finalize() использовать метод Finalize() для очистки объекта из памяти, чтобы сделать необходимые работа по уборке.
6. В чем разница между NoClassDefFoundError и ClassNotFoundException?
-
NoClassDefFoundError — это исключение типа Error, вызванное JVM, и его не следует пытаться перехватить.
-
Причина этого исключения в том, что JVM или ClassLoader не могут найти определение класса в памяти, когда пытаются загрузить класс.Это действие происходит во время выполнения, то есть класс существует во время компиляции, но не может быть найден в время выполнения.Возможно, оно было удалено после мутации и т. д.;
-
ClassNotFoundException — это проверенное исключение, которое необходимо перехватывать и обрабатывать явным образом с помощью try-catch или объявлять с помощью ключевого слова throws в сигнатуре метода. При использовании Class.forName, ClassLoader.loadClass или ClassLoader.findSystemClass для динамической загрузки класса в память это исключение будет выдано, если класс не будет найден с помощью переданного в classpath параметра; другая возможная причина для выдачи этого исключения Класс был загружается в память одним загрузчиком классов, а другой загрузчик пытается его загрузить.
7. Какую часть try-catch-finally можно опустить?
- Ответ: catch можно не указывать
причина
-
На самом деле более строгое утверждение: try подходит только для обработки исключений времени выполнения, а try+catch подходит для обработки исключений времени выполнения + обычных исключений. То есть, если вы используете только try для обработки обычных исключений и не обрабатываете их с помощью catch, компиляция не пройдет, потому что компилятор жестко оговаривает, что если вы решите перехватывать обычные исключения, вы должны явно объявить их с помощью catch для дальнейшая обработка. Исключение времени выполнения не указывается во время компиляции, поэтому catch можно опустить и добавить к нему компилятор catch.
-
Теоретически компилятор не видит никакого кода, приятного глазу, и думает, что могут быть потенциальные проблемы, поэтому даже если вы добавите try ко всему коду, код просто добавляет слой скина на основе нормальной работы на время выполнения. Но как только вы добавляете попытку к фрагменту кода, вы явно обещаете компилятору перехватывать исключения, которые могут быть вызваны этим кодом, а не создавать их. Если это обычное исключение, компилятор требует, чтобы оно было перехвачено с помощью catch для дальнейшей обработки; если перехватывается исключение времени выполнения, то оно отбрасывается и +finally завершается для обработки или добавляется с помощью catch для дальнейшей обработки.
-
Как и в конечном итоге, в конечном итоге происходит вопрос не захватывает «моп-вверх» для обработки исключений.
8. В try-catch-finally, если в catch будет return, будет ли finally выполнен?
-
Ответ: Он будет выполнен, и он будет выполнен до возврата.
-
Уведомление: Способ изменения возвращаемого значения в finally не является хорошим, потому что, если есть блок кода finally, оператор RETURN в TRY не сразу вернет вызывающую сторону, но возвращаемое значение будет завершено после завершения блока кода finally. , то вызывающий объект Возвращает свое значение, а затем, если возвращаемое значение изменяется в Наконец, будет возвращено измененное значение. Очевидно, что с возвратом или модификацией возвращаемого значения в Наконец, у программы большая беда, и программист напрямую используется в C#, чтобы не дать программисту высушить такого рода вещи, и Java также может передать уровень синтаксиса компилятору , Для генерации предупреждений или ошибок.
Пример кода 1:
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
*/
} finally {
a = 40;
}
return a;
}
- Результат выполнения: 30
Пример кода 2:
public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;
} finally {
a = 40;
//如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
return a;
}
}
- Результат исполнения: 40
9. Класс ExampleA наследует Exception, а класс ExampleB наследует ExampleA.
- Существует следующий фрагмент кода:
try {
throw new ExampleB("b")
} catch(ExampleA e){
System.out.println("ExampleA");
} catch(Exception e){
System.out.println("Exception");
}
-
Каков результат выполнения этого кода?
-
отвечать: Вывод: ПримерA. (Согласно принципу подстановки Лисков [где может использоваться супертип, должен использоваться подтип], блок catch, который перехватывает исключение типа ExampleA, может перехватывать исключение типа ExampleB, выброшенное в блоке try)
-
Вопрос для интервью. Укажите результат выполнения приведенного ниже кода. (Источником этого вопроса является книга «Идеи программирования на Java»)
class Annoyance extends Exception {
}
class Sneeze extends Annoyance {
}
class Human {
public static void main(String[] args)
throws Exception {
try {
try {
throw new Sneeze();
} catch ( Annoyance a ) {
System.out.println("Caught Annoyance");
throw a;
}
} catch ( Sneeze s ) {
System.out.println("Caught Sneeze");
return ;
} finally {
System.out.println("Hello World!");
}
}
}
- результат
Caught Annoyance
Caught Sneeze
Hello World!
10. Каковы обычные runtimeexceptions?
- ClasscasteException (исключение в классе)
- IndexOutOfBoundsException (массив выходит за границы)
- NullPointerException (нулевой указатель)
- ArrayStoreException (исключение хранения данных, тип несовместим при работе с массивом)
- Существуют также исключения BufferOverflowException для операций ввода-вывода.
11. Каковы распространенные исключения в Java
-
java.lang.IllegalAccessError: ошибка незаконного доступа. Когда приложение пытается получить доступ, изменить поле класса (Field) или вызвать его методы, но оператор видимости нарушает домен или методы, Thrown.
-
java.lang.InstantiationError: ошибка создания экземпляра. Генерируется, когда приложение пытается создать абстрактный класс или интерфейс с помощью нового оператора Java.
-
java.lang.OutOfMemoryError: Ошибка нехватки памяти. Генерируется, когда виртуальной машине Java недостаточно памяти для выделения объекту.
-
java.lang.StackOverflowError: ошибка переполнения стека. Возникает, когда приложение рекурсивно вызывает слишком глубокое переполнение стека или застревает в бесконечном цикле.
-
java.lang.ClassCastException: исключение приведения классов. Предположим, что существуют классы A и B (A не является родителем или подклассом B), а O является экземпляром A, тогда это исключение выдается, когда O принудительно создается как экземпляр класса B. Это исключение часто называют исключением приведения.
-
java.lang.ClassNotFoundException: исключение класса не найдено. Это исключение возникает, когда приложение пытается создать класс на основе имени класса в строковой форме и не может найти файл класса с соответствующим именем после обхода CLASSPAH.
-
java.lang.ArithmeticException: исключение арифметического условия. Например: целочисленное деление на ноль и т.д.
-
java.lang.ArrayIndexOutOfBoundsException: исключение индекса массива за пределами границ. Когда значение индекса брошенного массива отрицательное, оно равно или превышает размер массива.
-
java.lang.IndexOutOfBoundsException: исключение индекса за пределами границ. Это исключение возникает, когда значение индекса доступа к последовательности меньше 0 или больше или равно размеру последовательности.
-
java.lang.InstantiationException: Исключение инстанцирования. Это исключение возникает при попытке создать экземпляр класса, который является абстрактным классом или интерфейсом, с помощью метода newInstance().
-
java.lang.noSuchfieldException: собственность не существует исключения. Брошенный при доступе к несуществующей собственности класса.
-
java.lang.noSuchmethodexception: метод не существует исключения. Брошен, когда доступен несуществующий метод класса. -
-
java.lang.NullPointerException: исключение нулевого указателя. Генерируется, когда приложение пытается использовать null там, где требуется объект. Например: вызов метода экземпляра нулевого объекта, доступ к свойствам нулевого объекта, вычисление длины нулевого объекта, использование оператора throw для создания нулевого значения и так далее.
-
java.lang.NumberFormatException: исключение числового формата. Это исключение возникает при попытке преобразовать строку в указанный числовой тип, а строка не соответствует требуемому формату числового типа.
-
java.lang.StringIndexOutOfBoundsException: исключение строкового индекса за пределами границ. При доступе к строке символов с использованием значения индекса, значение индекса меньше 0 или больше или равно последовательности размера, возникает исключение.
Лучшие практики обработки исключений Java
-
Обработка исключений в Java — непростая задача. Мало того, что это сложно понять новичкам, даже некоторым опытным разработчикам приходится тратить много времени на размышления о том, как обрабатывать исключения, в том числе о том, какие исключения нужно обрабатывать, как их обрабатывать и так далее. Вот почему большинство команд разработчиков формулируют некоторые правила для стандартизации обработки исключений. И эти нормы часто сильно различаются между командами.
-
В этой статье представлены несколько передовых методов обработки исключений, используемых многими командами.
1. Очистите ресурсы в блоке finally или используйте оператор try-with-resource.
- При использовании ресурса, такого как InputStream, который необходимо закрыть после использования, распространенной ошибкой является закрытие ресурса в конце блока try.
public void doNotCloseResourceInTry() {
FileInputStream inputStream = null;
try {
File file = new File("./tmp.txt");
inputStream = new FileInputStream(file);
// use the inputStream to read a file
// do NOT do this
inputStream.close();
} catch (FileNotFoundException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}
}
- Проблема в том, что этот код может работать правильно, когда нет аномалий. Код в блоке кода TRY будет выполняться нормально, и ресурс можно будет отключить. Тем не менее, использование блока кода TRY является причиной, обычно он называется одним или несколькими методами, которые могут вызвать исключение, и вы можете выдать исключение, что означает, что код может не выполняться в последний раз, когда блок кода TRY. В результате вы не закрываете ресурс.
Итак, вы должны наконец добавить код очистки или использовать функцию попытки с ресурсом.
1.1 Использование блоков finally
- В отличие от блока try в предыдущих строках, блок finally выполняется всегда. Неважно, успешно ли выполняется блок try или после того, как вы обработаете исключение в блоке catch. Таким образом, вы можете убедиться, что вы очищаете все открытые ресурсы.
public void closeResourceInFinally() {
FileInputStream inputStream = null;
try {
File file = new File("./tmp.txt");
inputStream = new FileInputStream(file);
// use the inputStream to read a file
} catch (FileNotFoundException e) {
log.error(e);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
log.error(e);
}
}
}
}
1.2 Java 7 TRY-SISTAX
- Вы можете использовать этот синтаксис, если ваш ресурс реализует интерфейс AutoCloseable. Большинство стандартных ресурсов Java наследуют этот интерфейс. Когда вы открываете ресурс в предложении try, ресурс автоматически закрывается после выполнения блока try или после обработки исключения.
public void automaticallyCloseResource() {
File file = new File("./tmp.txt");
try (FileInputStream inputStream = new FileInputStream(file);) {
// use the inputStream to read a file
} catch (FileNotFoundException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}
}
2. Приоритеты к явным исключениям
-
Чем больше вы процветаете, тем лучше, всегда помните, ваш коллега или несколько месяцев спустя, вы вызовете свой метод и обработаете исключение.
-
Следовательно, необходимо гарантировать информацию, предоставленную им как можно больше. Это облегчает понимание вашего API. Вызывающий ваш метод может лучше справиться с исключением и избежать дополнительных чеков.
-
Поэтому вы всегда пытаетесь найти наиболее подходящий тип аномальных событий, например, выбрасываете исключение NumberFormatException вместо исключения IllegalArgumentException. Избегайте создания явного исключения.
public void doNotDoThis() throws Exception {
...
}
public void doThis() throws NumberFormatException {
...
}
3. Исключения для документов
- Документация также требуется, когда для метода объявляется исключение. Цель состоит в том, чтобы предоставить вызывающей стороне как можно больше информации, чтобы исключения можно было лучше избегать или обрабатывать.
Добавьте оператор @throws в Javadoc и опишите сценарии, в которых генерируются исключения.
public void doSomething(String input) throws MyBusinessException {
...
}
4. Используйте описательное сообщение
-
Когда возникает исключение, необходимо как можно точнее описать проблему и связанную с ней информацию, чтобы люди могли легко прочитать ее, независимо от того, печатается ли она в журнале или в инструменте мониторинга, чтобы конкретная ошибка информация, неверная информация может быть лучше локализована серьезность и т. д.
-
Но это не значит, что о сообщении об ошибке можно долго говорить, потому что имя класса Exception может отражать причину ошибки, поэтому его нужно описать всего в одном-двух предложениях.
-
Если возникает конкретное исключение, вполне вероятно, что имя его класса уже описывает ошибку. Таким образом, вам не нужно предоставлять много дополнительной информации. Хорошим примером является NumberFormatException . Когда вы предоставляете строку в неправильном формате, она будет выброшена конструктором класса java.lang.Long.
try {
new Long("xyz");
} catch (NumberFormatException e) {
log.error(e);
}
5. Сначала поймайте самое конкретное исключение
-
Большинство IDE могут помочь вам достичь этого передового опыта. Когда вы впервые попытаетесь зафиксировать менее конкретные исключения, они сообщат, что блок кода недоступен.
-
Но проблема в том, что будет выполнен только первый блок catch, соответствующий исключению. Таким образом, если вы поймаете IllegalArgumentException в первую очередь, вы никогда не доберетесь до блока catch, который должен обрабатывать более конкретное NumberFormatException, потому что он является подклассом IllegalArgumentException.
-
Всегда сначала перехватывайте наиболее конкретный класс исключений и добавляйте менее специфичные блоки перехвата в конец списка.
-
Вы можете увидеть пример такой инструкции try-catch в приведенном ниже фрагменте кода. Первый блок catch обрабатывает все исключения NumberFormatException, а второй обрабатывает все исключения IllegalArgumentException, которые не являются исключениями NumberFormatException.
public void catchMostSpecificExceptionFirst() {
try {
doSomething("A message");
} catch (NumberFormatException e) {
log.error(e);
} catch (IllegalArgumentException e) {
log.error(e)
}
}
6. Не захватывайте класс Throwable
-
Throwable — это суперкласс для всех исключений и ошибок. Вы можете использовать его в предложении catch, но вы никогда не должны этого делать!
-
Если вы используете Throwable в предложении catch, он будет перехватывать не только все исключения, но и все ошибки. JVM выдает ошибку, указывающую на серьезную проблему, которая не должна обрабатываться приложением. Типичными примерами являются OutOfMemoryError или StackOverflowError. Оба вызваны условиями, не зависящими от приложения, и с ними нельзя справиться.
-
Итак, лучше не перехватывать Throwable, если вы не уверены, что находитесь в особой ситуации для обработки ошибок.
public void doNotCatchThrowable() {
try {
// do something
} catch (Throwable t) {
// don't do this!
}
}
7. Не игнорируйте исключения
- Часто разработчики уверены, что исключения не будут выброшены, поэтому они пишут блок catch, но не выполняют никакой обработки или регистрации.
public void doNotIgnoreExceptions() {
try {
// do something
} catch (NumberFormatException e) {
// this will never happen
}
}
-
Но реальность такова, что часто возникают непредвиденные исключения, или невозможно определить, изменится ли код здесь в будущем (удалить код, предотвращающий генерирование исключения), и в это время, поскольку исключение поймано, невозможно получить достаточно информации об ошибке для решения проблемы позиционирования.
-
Разумно хотя бы регистрировать необычную информацию.
public void logAnException() {
try {
// do something
} catch (NumberFormatException e) {
log.error("This should never happen: " + e);
}
}
8. Не логируйте и не выбрасывайте исключения
- Это, вероятно, наиболее часто упускаемая из виду передовая практика в этой статье. Можно обнаружить, что во многих кодах и даже в библиотеках классов есть логика для перехвата исключений, их регистрации и повторного генерирования. следующее:
try {
new Long("xyz");
} catch (NumberFormatException e) {
log.error(e);
throw e;
}
- Такая логика обработки кажется разумной. Но это часто выводит несколько журналов для одного и того же исключения. следующее:
17:44:28,945 ERROR TestExceptionHandling:65 - java.lang.NumberFormatException: For input string: "xyz"
Exception in thread "main" java.lang.NumberFormatException: For input string: "xyz"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:589)
at java.lang.Long.(Long.java:965)
at com.stackify.example.TestExceptionHandling.logAndThrowException(TestExceptionHandling.java:63)
at com.stackify.example.TestExceptionHandling.main(TestExceptionHandling.java:58)
- Как показано выше, более поздние журналы также не содержат дополнительной полезной информации. Если вы хотите предоставить больше полезной информации, вы можете обернуть исключение как пользовательское исключение.
public void wrapException(String input) throws MyBusinessException {
try {
// do something
} catch (NumberFormatException e) {
throw new MyBusinessException("A message that describes the error.", e);
}
}
- Следовательно, только тогда, когда вы хотите обработать исключение, в противном случае вам нужно только объявить вызывающую сторону для обработки в сигнатуре метода.
9. Не выбрасывайте оригинальное исключение при обертывании исключения
- Обычной практикой является перехват стандартных исключений и оформление их как настраиваемых исключений. Таким образом, можно добавить более конкретную информацию об исключениях и выполнить целенаправленную обработку исключений.
При этом убедитесь, что в качестве причины установлено исходное исключение (примечание: см. исходное исключение e в коде NumberFormatException e ниже). Класс Exception предоставляет специальный метод конструктора, который принимает Throwable в качестве параметра. В противном случае вы потеряете трассировку стека и сообщение исходного исключения, что затруднит анализ события исключения, вызвавшего исключение.
public void wrapException(String input) throws MyBusinessException {
try {
// do something
} catch (NumberFormatException e) {
throw new MyBusinessException("A message that describes the error.", e);
}
}
10. Не используйте процесс программы контроля исключений
- Не следует использовать для выполнения приложений управления процессом исключения, например, случай должен использоваться, если это утверждение будет оценено, но вы используете обработку исключения, это очень плохой привычка, она серьезно повлияет на производительность приложения.
11. Используйте стандартные исключения
- Если использование встроенных исключений решает проблему, не определяйте свои собственные. API Java предоставляет сотни типов исключений для различных ситуаций. При разработке максимально используйте исключения, предоставляемые API Java. Если стандартные исключения не соответствуют вашим требованиям, создайте собственные пользовательские исключения. Максимально используйте стандартные исключения, чтобы помочь новым разработчикам понять код проекта.
12. Исключения влияют на производительность
-
Цена аномалии очень высока, и каждый Java-программист должен помнить об этом. Создание исключения происходит очень медленно, создание исключения занимает от 1 до 5 мс, что снижает производительность всего приложения, когда исключение передается между несколькими уровнями приложения.
- Используйте исключения только в исключительных обстоятельствах;
- Используйте исключения в восстанавливаемых исключительных ситуациях;
-
Хотя это исключение в пользу Java-разработки, но лучше не перехватывать слишком много стека вызовов в приложении, потому что во многих случаях не нужно распечатывать стек вызовов, чтобы знать, что пошло не так. Следовательно, сообщение об исключении должно предоставлять только правильную информацию.
13. Резюме
-
Подводя итог, можно сказать, что существует множество различных ситуаций, которые следует учитывать при генерации или перехвате исключений, и большинство из них касается улучшения читаемости кода или удобства использования API.
-
Исключения — это не только механизм контроля ошибок, но и средство коммуникации. Поэтому, чтобы лучше работать с коллегами, команда должна разработать лучшие практики и правила, чтобы члены команды могли понять эти общие концепции и использовать их в своей работе.
Обработка исключений — Руководство по разработке Java для Alibaba
-
[Обязательно] Исключение RuntimeException, определенное в библиотеке классов Java, которого можно избежать с помощью предварительной проверки, не должно обрабатываться с помощью catch, например NullPointerException, IndexOutOfBoundsException и т. д. Примечание: За исключением исключений, которые не могут пройти предварительную проверку, например, при разборе чисел в виде строк, может возникнуть ошибка формата числа, которую необходимо реализовать путем отлова NumberFormatException. Положительный пример: if (obj != null) {…} Отрицательный пример: try { obj.method(); } catch (NullPointerException e) {…}
-
[Обязательный] ненормальный не используется для контроля процесса, контроля условий. Описание: Исключение первоначально было разработано для решения различных непредвиденных обстоятельств, работающая программа, а эффективность обработки исключений намного ниже условного способа.
-
[Принудительно] Когда CATCH, пожалуйста, различайте стабильный код и нестабильный код, а стабильный код относится к коду, который не будет неправильным. Для Catch нестабильного кода выделяется тип исключения и выполняется соответствующее исключение. Объяснение: Try-catch в коде большого сегмента делает программу неспособной правильно реагировать на стресс в соответствии с различными исключениями, что не способствует проблемам с позиционированием, что является безответственным проявлением. Исправление: в сцене, зарегистрированной пользователем, если пользователь вводит недопустимый символ, или имя пользователя уже существует, или пользователь вводит слишком простой пароль, выполняется присвоение класса разделения, и он запрашивается у пользователя.
-
[Обязательно] Целью перехвата исключения является его обработка. Не перехватывайте его, а затем отбрасывайте. Если вы не хотите его обрабатывать, отправьте исключение вызывающей стороне. Самый удаленный бизнес-пользователь должен обрабатывать исключения и преобразовывать их в контент, понятный пользователям.
-
[Обязательно] В код транзакции помещается блок try.После исключения catch, если вам необходимо откатить транзакцию, необходимо обратить внимание на ручной откат транзакции.
-
[Обязательно] Блок finally должен закрыть объект ресурса и объект потока, а также выполнить try-catch, если есть исключение. Примечание. Если JDK7 и выше, вы можете использовать метод try-with-resources.
-
[Обязательно] Не используйте return в блоке finally. Примечание: после успешного выполнения оператора return в блоке try он не возвращается немедленно, а продолжает выполнять оператор в блоке finally Если здесь есть оператор return, он возвращается прямо сюда, а точка возврата в блоке finally блок try безжалостно отбрасывается. Пример счетчика:
private int x = 0;
public int checkReturn() {
try {
// x等于1,此处不返回
return ++x;
} finally {
// 返回的结果是2
return ++x;
}
}
-
[Обязательно] Перехватывающее исключение и выбрасывающее исключение должны точно совпадать, иначе перехватывающее исключение является родительским классом выбрасывающего исключения. Объяснение: Если ожидается, что противник бросит гортензию, но на самом деле толкает ядро, произойдет несчастный случай.
-
[Обязательно] При вызове RPC, сторонних пакетов или связанных методов динамически генерируемых классов класс Throwable должен использоваться для перехвата исключений. Описание: метод вызывается через механизм отражения, если метод не найден, выбрасывается исключение NoSuchMethodException. Какие ситуации вызовут NoSuchMethodError? Когда двухсторонние пакеты конфликтуют с классами, механизм арбитража может привести к введению неожиданных версий, чтобы сигнатуры методов классов не совпадали, или соответствующие сигнатуры методов изменяются, когда инфраструктура модификации байт-кода (например, ASM) динамически создает или изменяет класс. В этих случаях при запуске кода будет выдаваться ошибка NoSuchMethodError, даже если код был правильным во время компиляции.
-
[Рекомендуется] Возвращаемое значение метода может быть NULL, не принудительно возвращать пустой набор или пустой объект и т. д., вы должны добавить примечание к значению NULL, которое будет возвращено. Примечание. Это руководство явно запрещает NPE нести ответственность за вызывающего абонента. Даже если метод вызова возвращает пустую коллекцию или пустой объект, это не относится к вызывающему объекту, это не низкая подушка, и он должен учитывать скорость сбоя удаленного вызова, сбой сериализации и исключения времени выполнения. должен вернуть NULL.
-
[Рекомендация] Предотвращение NPE является базовым навыком для программистов.Обратите внимание на сценарии, в которых происходит NPE: 1) Когда возвращаемый тип является базовым типом данных и при возврате объекта типа данных упаковки автоматическая распаковка может генерировать NPE. Пример счетчика: public int f() { return Integer object}, если null, автоматически распаковывать и выбрасывать NPE. 2) Результат запроса базы данных может быть нулевым. 3) Даже если элемент в коллекции NotEmpty, извлеченный элемент данных может быть нулевым. 4) Когда удаленный вызов возвращает объект, всегда требуется оценка нулевого указателя для предотвращения NPE. 5) Для данных, полученных в сеансе, рекомендуется выполнить проверку NPE, чтобы избежать нулевых указателей. 6) Каскадные вызовы obj.getA().getB().getC(); серия вызовов легко генерирует NPE.
Положительный пример: используйте дополнительный класс JDK8 для предотвращения проблем NPE. -
[Рекомендация] При определении различайте непроверенные и проверенные исключения, избегайте прямого создания нового RuntimeException(), не говоря уже о выбрасывании Exception или Throwable, и используйте пользовательские исключения с бизнес-значением. Мы рекомендуем пользовательские исключения, которые были определены в отрасли, такие как DAOException / ServiceException и т. д.
-
[Ссылка] «Код ошибки» должен использоваться для открытого интерфейса http/api за пределами компании; в то время как исключение генерируется внутри приложения; метод Result предпочтительнее для вызовов RPC между приложениями, инкапсулируя метод isSuccess(), "код ошибки", "краткое сообщение об ошибке". Описание: Причины использования метода Result в качестве метода возврата метода RPC: 1) При использовании метода возврата генерирующего исключения, если вызывающая сторона не поймает его, произойдет ошибка времени выполнения. 2) Если вы не добавляете информацию о стеке, просто добавляете новое пользовательское исключение и добавляете свое собственное сообщение об ошибке, это не слишком поможет вызывающему абоненту решить проблему. Если добавляется информация о стеке, в случае частых ошибок вызовов потеря производительности сериализации и передачи данных также является проблемой.
-
[Ссылка] Избегайте повторяющегося кода (Don't Repeat Yourself), то есть принцип DRY. Примечание: Копирование и вставка кода по желанию неизбежно приведёт к повторению кода, при необходимости его модификации в будущем необходимо модифицировать все копии, что легко пропустить. Извлекайте общие методы, когда это необходимо, или абстрагируйте общедоступные классы, или даже разделяйте их на компоненты. Положительный пример: в классе есть несколько общедоступных методов, каждый из которых должен выполнять несколько строк одной и той же операции проверки параметров.На данный момент извлеките:
private boolean checkParam(DTO dto) {…}