try та catch

Типи даних і винятки в Java

Jim White

Java Developer

Проблеми в Java

  • У застосунках можуть виникати проблеми чи збої
    • Через некоректне введення
    • Через помилки в коді
    • Через непередбачувані обставини
  • Такі проблеми називають винятками
    • Переривають звичайний потік керування
  • Java генерує (throws) винятки
Типи даних і винятки в 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 {
    // Оператори для виконання та відстеження на винятки
}
Типи даних і винятки в Java

Catch

  • Розмістіть блок catch після try
    • Працює як обробник проблем з винятками
    • Спійманий виняток передається в цей блок як параметр
  • Блоки try/catch обов'язкові для деяких типів винятків
    • Для інших — необов'язкові
try {
    // Оператори для виконання та відстеження на винятки
} catch (<Exception type> <variable name>) {
    // Оператори для виконання, якщо стався виняток
}
Типи даних і винятки в 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("Отакої — хибний індекс");
}
Отакої — хибний індекс
Типи даних і винятки в 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("Отакої — хибний індекс");
} catch (NumberFormatException eValueOf) {
    System.out.println(
      "Отакої — рядок не є числом");
}
Отакої — рядок не є числом
Типи даних і винятки в Java

Catch «усе»

  • Використовуйте catch (Exception variable){ } як універсальний обробник
    • Опрацьовує будь-які винятки, не перехоплені іншими блоками catch
try {
    // Код для виконання
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Отакої — хибний індекс");
} catch (NumberFormatException eValueOf) {
    System.out.println("Отакої — рядок не є числом");
} catch (Exception e) { // Опрацьовує всі, крім двох вище
    System.out.println("Сталося щось непередбачене");
}
Типи даних і винятки в Java

Finally

  • Код у блоці finally виконується завжди
// Коли стається виняток
try {
    Integer.valueOf("one");
} catch (NumberFormatException eValueOf) {
    System.out.println("Отакої");
} finally {
    System.out.println("Виконуємо прибирання");
}
Отакої
Виконуємо прибирання

 

// Коли виняток не генерується
try {
    Integer.valueOf("1");
} catch (NumberFormatException eValueOf) {
    System.out.println("Отакої");
} finally {
    System.out.println("Виконуємо прибирання");
}
Виконуємо прибирання
Типи даних і винятки в Java

Об'єкт Exception

  • Об'єкт 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...