Try и Catch

Типы данных и исключения в Java

Jim White

Java Developer

Проблемы в Java

  • В приложениях могут возникать проблемы
    • Из-за неверных входных данных
    • Из-за ошибок в коде
    • Из-за непредвиденных обстоятельств
  • Такие проблемы называются исключениями
    • Они прерывают нормальный поток выполнения
  • Java выбрасывает исключения
Типы данных и исключения в Java

Пример исключения

public static void main(String[] args) {
    ArrayList<String> allStars = new ArrayList<String>();
    allStars.add("Mays");
    allStars.add("Aaron");
    allStars.add("Ruth");
    String last = allStars.get(3); // This will cause an exception
    System.out.println(last);
}
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of 
bounds for length 3
Типы данных и исключения в Java

Try

  • Оберните код, способный вызвать исключение, в блок try
    • «Выполни этот код, а при возникновении проблемы передай управление блоку catch»
try {
    // Statements to be executed and watched for exceptions
}
Типы данных и исключения в Java

Catch

  • Добавьте блок catch после блока try
    • Он выступает обработчиком возникших исключений
    • Перехваченное исключение передаётся в блок как параметр
  • Блоки try/catch обязательны для некоторых типов исключений
    • Для других — необязательны
try {
    // Statements to be executed and watched for exceptions
} catch (<Exception type> <variable name>) {
    // Statements to execute if an exception has occurred
}
Типы данных и исключения в Java

Перехват IndexOutOfBoundsException

try {
  ArrayList<String> allStars = new ArrayList<String>();
  allStars.add("Mays");
  allStars.add("Aaron");
  allStars.add("Ruth");
  String last = allStars.get(3); // Accessing an element that isn't there
  System.out.println(last);
} catch (IndexOutOfBoundsException e) {
  System.out.println("Oops - wrong index");
}
Oops - wrong index
Типы данных и исключения в Java

Несколько блоков catch

  • Используйте несколько блоков catch для обработки разных типов исключений
  • Каждый блок catch имеет собственный тип исключения и переменную
  • При возникновении исключения Java проверяет блоки catch по порядку до первого совпадения
try {
    ArrayList<String> nums 
      = new ArrayList<String>();
    nums.add("one");
    String last = nums.get(0);
    Integer.valueOf(last);
    System.out.println(last);
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Oops - wrong index");
} catch (NumberFormatException eValueOf) {
    System.out.println(
      "Oops - String not a number");
}
Oops - String not a number
Типы данных и исключения в Java

Catch «все исключения»

  • Используйте catch (Exception variable){ } как универсальный обработчик
    • Перехватывает любое исключение, не обработанное предыдущими блоками catch
try {
    // Code to try
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Oops - wrong index");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops - String not a number");
} catch (Exception e) { // Handles all exceptions except the two above
    System.out.println("Something unplanned happened");
}
Типы данных и исключения в Java

Finally

  • Код в блоке finally выполняется всегда
// When exception happens
try {
    Integer.valueOf("one");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops");
} finally {
    System.out.println("Doing cleanup");
}
Oops
Doing cleanup

 

// When no exception gets thrown
try {
    Integer.valueOf("1");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops");
} finally {
    System.out.println("Doing cleanup");
}
Doing cleanup
Типы данных и исключения в Java

Объект исключения

  • Объект Exception, передаваемый в блок catch, содержит подробную информацию
  • Используйте его методы, чтобы узнать причину ошибки
    • .getMessage() — возвращает понятное описание причины
    • .getClass() — возвращает класс или тип исключения
    • .printStackTrace() — выводит трассировку стека (следующий слайд)
public class ExceptionExample {

    public static void main(String[] args) {
        try {
            Integer.valueOf("one");
        } catch (NumberFormatException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
Типы данных и исключения в Java

Трассировка стека исключения

  • Трассировка стека отражает путь выполнения программы до момента возникновения ошибки
    • Ниже приведён вывод из предыдущего примера — включая трассировку стека
For input string: "one"
java.lang.NumberFormatException: For input string: "one"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    at java.base/java.lang.Integer.parseInt(Integer.java:661)
    at java.base/java.lang.Integer.valueOf(Integer.java:988)
    at foo/exceptions.ExceptionExample.main(ExceptionExample.java:7)
Типы данных и исключения в Java

Давайте потренируемся!

Типы данных и исключения в Java

Preparing Video For Download...