Урок 17

Классы исключений


1. Иерархия классов исключений

Иерархия классов исключений

Исключения (Exception) являются результатом проблем в программе, которые в принципе решаемы и предсказуемы. Например, произошло деление на ноль в целых числах.

Ошибки (Error) представляют собой более серьёзные проблемы, которые, согласно спецификации Java, не следует пытаться обрабатывать в собственной программе, поскольку они связаны с проблемами уровня JVM. Например, исключения такого рода возникают, если закончилась память, доступная виртуальной машине. Программа дополнительную память всё равно не сможет обеспечить для JVM.

У класса Exception имеется важный подкласс - RuntimeException. Исключения этого типа автоматически определяются для создаваемых вами прикладных программ и охватывают такие ошибки, как деление на нуль и ошибочная индексация массивов.

Все исключения делятся на два типа - неконтролируемые и контролируемые. 

Неконтролируемые исключения (unchecked) - RuntimeException, Error и их наследники.

Контролируемые исключения (checked) - все остальные наследники класса Exception.

Пример 1. Контролируемое исключение ParseException

import java.text.NumberFormat;
import java.text.ParseException;

public class NumberFormatDemo4 {
    public static void main(String[] args) {
        NumberFormat nf = NumberFormat.getInstance();
        try {
            System.out.println(nf.parse("1234,567"));
            nf.setParseIntegerOnly(true);
            System.out.println(nf.parse("1234,567"));
        } catch (ParseException pe) {
            System.out.println("Parse exception");
        }
    }
}

Пример 2. Неконтролируемое исключение ArithmeticException

public class ExceptionDemo1 {
    public static void main(String[] args) {
        subRoutine();
    }

    public static void subRoutine() {
        int d = 0;
        int a = 10 / d;
    }
}

Пример 3. Неконтролируемое исключение ArrayIndexOutOfBoundsException

public class ExceptionDemo2 {
    public static void main(String[] args) {
        int[] array = new int[3];
        System.out.println(array[4]);
    }
}

2. Подклассы не контролируемых исключений, производные от класса RunTimeException

Исключение

Значение

ArithmeticException

Арифметическая ошибка типа деления на нуль

ArrayIndexOutOfBoundsException

Индекс массива находится вне границ

ArrayStoreException

Назначение элементу массива несовместимого типа

ClassCastException

Недопустимое приведение типов

IllegalArgumentException

При вызове метода использован незаконный аргумент

IllegalMonitorStateException

Незаконная операция монитора, типа ожидания на разблокированном потоке

IllegalStateException

Среда или приложение находятся в некорректном состоянии

IllegalThreadStateException

Требуемая операция не совместима с текущим состоянием потока

IndexOutOfBoundsException

Некоторый тип индекса находится вне границ

NegativeArraySizeException

Массив создавался с отрицательным размером

NullPointerException

Недопустимое использование нулевой ссылки

NumberFormatException

Недопустимое преобразование строки в числовой формат

SecurityException

Попытка нарушить защиту

StringIndexOutOfBoundsException

Попытка индексировать вне границ строки

UnsupportedOperationException

Встретилась не поддерживаемая операция

3. Подклассы контролируемых исключений

Исключение

Значение

ClassNotFoundException

Класс не найден

CloneNotSupportedException

Попытка клонировать объект, который не реализует интерфейс Cloneable

IllegalAccessException

Доступ к классу отклонен

InstantiationException

Попытка создавать объект абстрактного класса или интерфейса

InterruptedException

Один поток был прерван другим потоком

NoSuchFieldException

Требуемое поле не существует

NoSuchMethodException

Требуемый метод не существует

Пример 4. Возникновение StackOverflowError

public class StackOverflowErrorExample {
    public static void main(String[] args) {
        System.out.println("1");
        main(args);
    }
}

Пример 5. Возникновение ClassCastException

public class ClassCastExceptionExample {
    public static void main(String[] args) {
        method(new int[0]);
    }

    private static void method(Object arg) {
        String x = (String) arg;
    }
}

Пример 6. Возникновение ClassNotFoundException

public class ClassNotFoundExceptionExample {
    public static void main(String[] args) throws ClassNotFoundException {
        Class clazz0 = Integer.class;
        Class clazz1 = "Hello".getClass();
        Class clazz2 = Class.forName("com.lib.MyClass");
        //   User = clazz2.newInstance();
        //   com.lib.MyClass myClass = new MyClass();
    }
}

Пример 7. Возникновение NullPointerException

public class NullPointerExceptionExample {
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length());
    }
}

4. Методы, определенные в классе Throwable

  • Тhrowable getCause() - возвращает исключение, положенное в основу текущего исключения. Если такое исключение отсутствует, то возвращается пустое значение null.
  • String getLocalizedMessage() - возвращает локализованное описание исключения.
  • String getMessage() - возвращает описание исключения.
  • StackTraceElement[] getStackTrace() - возвращает массив, содержащий поэлементную трассировку стека в виде объектов класса StackTraceElement. На вершине стека находится метод, который был вызван непосредственно перед генерированием исключения. Этот метод содержится в первом элементе массива. Класс StackTraceElement предоставляет доступ к данным о каждом элементе трассировки, например к имени  вызванного метода.
  • void printStackTrace() - отображает трассу стека.
  • void printStackTrace(PrintStream stream) - посылает трассу стека указанному потоку.
  • void printStackTrace(PrintWriter stream) - посылает проекцию прямой стека указанному потоку.
  • String toString() - возвращает String-объект, содержащий описание исключения. Этот метод вызывается из println() при выводе Throwable-объекта.


0 comments
Leave your comment: