Java попробуйте поймать наконец

Блоки Java try, catch и finally помогают в написании кода приложения, который может выдавать исключения во время выполнения и дает нам возможность либо восстановиться после исключений, выполнив альтернативную логику приложения, либо изящно обработать исключение, чтобы сообщить об этом пользователю. Это помогает предотвратить некрасивые сбои приложения.

Обратите внимание, что рекомендуется использовать блок try-with-resources каждый раз, когда это возможно.

1. Основы

Прежде чем углубляться в концепцию, давайте рассмотрим самые основы блоков try-catch и их синтаксиса.

1.1. попробовать

Блок try содержит код приложения, который, как ожидается, будет работать в нормальных условиях. Например, чтение файла, запись в базы данных или выполнение сложных бизнес-операций.

Блок try записывается с ключевым словом try, за которым следуют фигурные скобки.

try {//application code}

1.2. поймать

Необязательный блок(и) catch следует за блоком try и ДОЛЖЕН обрабатывать проверенные исключения, выдаваемые блоком try, а также любые возможные непроверенные исключения.

try {//code}catch(Exception e) {//handle exception}

Приложение может пойти не так N разными способами. Вот почему мы можем связать несколько блоков catch с одним блоком try. В каждом блоке catch мы можем обработать одно или несколько конкретных исключений уникальным способом.

Когда один блок catch обрабатывает исключение, следующие блоки catch не выполняются. Управление переходит непосредственно от выполненного блока catch для выполнения оставшейся части программы, включая блок finally.

try {//code}catch(NullPointerException e) {//handle exception}catch(NumberFormatException e) {//handle exception}catch(Exception e) {//handle exception}

1.3. наконец

Необязательный блок finally дает нам возможность запустить код, который мы хотим выполнить, ВСЕГДА, КОГДА завершается блок try-catch — как с ошибками, так и без них.

Операторы блока finally гарантированно будут выполнены, даже если нам не удастся успешно обработать исключение в блоке catch.

try {//open file//read file}catch(Exception e) {//handle exception while reading the file}finally {//close the file}

1.4. Только блок try является обязательным

Обратите внимание, что только блок try является обязательным, а блоки catch и finally — необязательными. С блоком try мы можем использовать либо блок catch, либо блок finally по мере необходимости.

Ниже приведены обе комбинации, которые можно использовать в Java. Обе версии допустимы.

 пытаться {}поймать(Исключение e) {}
 пытаться {}окончательно {}

2. Как в Java происходит исключение?

При нормальных обстоятельствах, когда во время выполнения происходит исключение, JVM оборачивает информацию об ошибке в экземпляр подтипа Throwable. Этот объект исключения похож на другие объекты Java и имеет поля и методы.

Единственное отличие состоит в том, что JVM проверяет их наличие и передает управление блоку catch, который может обрабатывать этот тип исключения или типы его родительского класса.

попробуй поймать наконец поток
попробуй поймать наконец поток

Если в приложении не найден блок catch для исключения, неперехваченное исключение обрабатывается обработчиком исключений по умолчанию на уровне JVM. Он сообщает об исключении пользователю и завершает приложение.

3. Различные потоки выполнения с блоками try, catch и finally

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

3.1. блоки try, catch и finally – НИКАКИХ исключений не произошло

Если не произошло исключения, то JVM выполнит только блок finally. Блок catch будет пропущен.

try{System.out.println("try block");}catch(Exception e){System.out.println("catch block");}finally{System.out.println("finally block");}

Вывод программы.

try blockfinally block

3.2. блоки try, catch и finally – произошло исключение

Если в блоке try возникло исключение, то JVM сначала выполнит блок catch, а затем блок finally.

try{System.out.println("try block");throw new NullPointerException("Null occurred");}catch(Exception e){System.out.println("catch block");}finally{System.out.println("finally block");}

Вывод программы.

try blockcatch blockfinally block

3.3. блоки try и finally – исключение НЕ обрабатывается

Если исключение не обрабатывается ни одним из предоставленных блоков catch, его обрабатывает обработчик исключений JVM по умолчанию. В этом случае будет выполнен блок finally, за которым последует механизм обработки исключений по умолчанию.

try{System.out.println("try block");throw new NullPointerException("Null occurred");}finally{System.out.println("finally block");}

Вывод программы.

try blockfinally blockException in thread "main"java.lang.NullPointerException: Null occurredat com.howtodoinjava.Main.main(Main.java:12)

3.4. блоки try, catch и finally – множественные блоки catch

Если с блоком try связано несколько блоков catch, то исключение обрабатывается первым блоком catch в последовательности, который может обрабатывать тип исключения или его родительские типы.

Например, блок catch, обрабатывающий IOException, может обрабатывать исключения типа FileNotFoundException также потому, что FileNotFoundException расширяет IOException.

try{System.out.println("try block");throw new NullPointerException("null occurred");}catch(NumberFormatException e){System.out.println("catch block 1");}catch(NullPointerException e){System.out.println("catch block 2");}catch(Exception e){System.out.println("catch block 3");}finally{System.out.println("finally block");}

Вывод программы.

try blockcatch block 2finally block

3.5. блоки try, catch и finally – исключение выбрасывается из блока catch

Могут быть случаи, когда возникает исключение при обработке другого исключения в блоке catch. Как оно будет обработано?

В случае исключения в блоке catch выполнение передается в блок finally(если таковой имеется), связанный с соответствующим блоком catch. Затем исключение распространяется в стеке вызовов методов для поиска блока catch, который может обработать это исключение.

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

try{System.out.println("try block");throw new NullPointerException("NullPointerException occured");}catch(NullPointerException e){System.out.println("catch block 1");throw new NumberFormatException("NumberFormatException occurred");}catch(Exception e){System.out.println("catch block 2");}finally{System.out.println("finally block");}

Вывод программы.

try blockcatch block 1finally blockException in thread "main"java.lang.NumberFormatException: NumberFormatException occurredat com.howtodoinjava.Main.main(Main.java:18)

4. Java 7 try-with-resources

Для ресурсов AutoCloseable, таких как потоки, Java SE 7 представила операторы try-with-resources, которые являются рекомендуемыми способами обработки исключений в упомянутых сценариях. При таком подходе нам не требуется закрывать потоки, и JVM делает это за нас. Это устраняет необходимость в блоках finally.

В try-with-resources ресурс открывается в блоке try внутри маленьких скобок, а затем блок полностью исчезает.

try(BufferedReader br = new BufferedReader(new FileReader("C:/temp/test.txt"))){String sCurrentLine;while((sCurrentLine = br.readLine()) != null){System.out.println(sCurrentLine);}}catch(IOException e){e.printStackTrace();}
Прокрутить вверх