Автор оригинала: Pankaj Kumar.
- Блок Java try-catch используется для обработки исключений в программе.
- Код в блоке try выполняется, и если возникает какое-либо исключение, для их обработки используется блок catch.
- Если блок catch не в состоянии обработать исключение, оно возвращается вызывающей программе.
- Если программа не в состоянии обработать исключение, оно возвращается в JVM, которая завершает программу и выводит трассировку стека исключений в выходной поток.
- За блоком try должен следовать либо catch, либо, наконец, блок.
Пример Java try-catch
Давайте рассмотрим простой код, в котором мы можем получить исключение.
package com.journaldev.examples; public class JavaTryCatch { public static void main(String[] args) { System.out.println(divide(20,5)); System.out.println(divide(20,0)); } public static double divide(int x, int y) { return x/y; } }
Выход:
4.0 Exception in thread "main" java.lang.ArithmeticException: / by zero at com.journaldev.examples.JavaTryCatch.divide(JavaTryCatch.java:11) at com.journaldev.examples.JavaTryCatch.main(JavaTryCatch.java:7)
Теперь давайте посмотрим, как использовать блок try-catch для обработки исключения, вызванного методом divide ().
package com.journaldev.examples; public class JavaTryCatch { public static void main(String[] args) { try { System.out.println(divide(20, 5)); System.out.println(divide(20, 0)); } catch (ArithmeticException ae) { System.out.println(ae.getMessage()); } } public static double divide(int x, int y) { return x / y; } }
Выход:
4.0 / by zero
Java пытается поймать несколько исключений
Мы можем перехватывать несколько исключений в серии блоков catch. Давайте рассмотрим простой пример использования нескольких блоков catch.
package com.journaldev.examples; public class JavaTryCatch { public static void main(String[] args) { try { foo(10); } catch (IllegalArgumentException ie) { System.out.println(ie.getMessage()); } catch (NullPointerException ne) { System.out.println(ne.getMessage()); } } public static void foo(int x) throws IllegalArgumentException, NullPointerException { // some code } }
Порядок Перехвата Исключений
Исключения Java имеют иерархию. Throwable-это суперкласс всех исключений и ошибок. При перехвате нескольких исключений сначала должно быть перехвачено наиболее конкретное исключение. В противном случае во время компиляции возникает ошибка с сообщением “Недоступный блок перехвата”. Это уже обрабатывается блоком catch для исключения”.
Приведенный ниже код приведет к ошибке во время компиляции, поскольку исключение NullPointerException должно быть поймано до исключения.
try { foo(10); } catch (Exception ie) { System.out.println(ie.getMessage()); } catch (NullPointerException ne) { System.out.println(ne.getMessage()); }
Перехват нескольких исключений в одном блоке перехвата
Если вы заметили приведенный выше код, мы печатаем сообщение об исключении во всех блоках catch. Java поддерживает перехват нескольких исключений в одном блоке перехвата. Эта функция была введена в Java 7.
try { foo(10); } catch (IllegalArgumentException | NullPointerException e) { System.out.println(e.getMessage()); }
Пример Java try-catch-finally
Блок finally всегда выполняется, даже если программа создает исключение и завершает работу. Блок finally обычно используется для того, чтобы убедиться, что ресурсы закрыты до завершения программы.
Вот реальный пример блока “попробуй-поймай-наконец”. Мы пытаемся открыть файл и обработать его. Мы используем блок finally, чтобы убедиться, что поток ввода файлов закрыт.
package com.journaldev.examples; import java.io.FileInputStream; import java.io.IOException; public class JavaTryCatch { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("data.txt"); // code to process the file fis.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (fis != null) try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }