Помилки та винятки

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

Jim White

Java Developer

Винятки проти помилок

  • Error — це серйозна проблема
  • Застосунки не можуть обробити й відновитися після помилок
    • Помилки змушують застосунок «падати» або зупинятися
    • Приклад: нестача памʼяті — це помилка в Java
  • Винятки застосунки можуть обробляти й відновлюватися
    • Спроба звернутися за межі розміру масиву — це виняток.
Типи даних і винятки в Java
Приклад помилки
import java.util.*;

public class CauseOutOfMemory {
    public static void main(String[] args) {
        List<Long> numbers = new ArrayList<Long>();
        long counter = 0;
        while (true) {
            numbers.add(counter);
            counter++;
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.base/java.lang.Long.valueOf(Long.java:1204)
    at foo/exceptions.CauseOutOfMemory.main(CauseOutOfMemory.java:12)
Типи даних і винятки в Java

Два типи винятків

Перевірюваний (Checked) виняток Runtime («unchecked») виняток
Потрібна обробка Так Ні
Загальна причина Речі поза нашим контролем Наші помилки програмування
Відновлення Зазвичай можливе, якщо передбачено Зазвичай неможливе
Механізм відновлення try/catch або throws Краще писати код, щоб їх уникати
Приклад Файл не знайдено Індекс масиву поза межами
Типи даних і винятки в Java

Checked і Runtime винятки

  • Підкласи Exception, що не є підкласами RuntimeException, — це перевірювані винятки
    • Їх треба обробити
    • Напр.: файл не знайдено (FileNotFoundException)
  • RuntimeException — суперклас для всіх неперевірюваних винятків
    • Не потребують обробки
    • Напр.: звернення до неіснуючого індексу масиву (IndexOutOfBoundsException)
    • Напр.: ділення на нуль (ArithmeticException)
Типи даних і винятки в Java

RuntimeException

Підклас RuntimeException Коли виникає
ArithmeticException Неприпустимі обчислення, як-от ділення на 0
IndexOutOfBoundsException Індекс для масиву, String тощо поза діапазоном
NegativeArraySizeException Спроба створити масив із відʼємним розміром
int y = 5/0; // код, що спричиняє ArithmeticException
int[] list = new int[-1];  // код, що спричиняє NegativeArraySizeException
Exception in thread "main" java.lang.ArithmeticException: / by zero
Exception in thread "main" java.lang.NegativeArraySizeException: -1
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/RuntimeException.html
Типи даних і винятки в Java

«Перевірюваний» виняток

public class LoadClass {
    public static void main(String[] args) {
        Class myClass = Class.forName("com.mysql.Driver");
    }
}
LoadClass.java:3: error: unreported exception ClassNotFoundException; 
must be caught or declared to be thrown
                Class myClass = Class.forName("com.mysql.Driver");
                                             ^
1 error
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Exception.html
Типи даних і винятки в Java

Давайте потренуємось!

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

Preparing Video For Download...