Автор оригинала: 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();
}
}
}
}