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

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

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

Все исключения делятся на три группы:

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

Ошибки (Errors) представляют собой более серьёзные проблемы, которые, согласно спецификации 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) throws ParseException {
        NumberFormat nf = NumberFormat.getInstance();
        System.out.println(nf.parse("1234,567"));
        nf.setParseIntegerOnly(true);
        System.out.println(nf.parse("1234,567"));
    }
}

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

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

public class ExceptionDemo4 {
    public static void main(String[] args) {
        try {
            parseNumber("sss");
        } catch (ParseException e) {
            System.out.println(e.getMessage());
        }
        System.out.println("Конец программы.");
    }

    public static void parseNumber(String str) throws ParseException {
        NumberFormat nf = NumberFormat.getInstance();
        System.out.println(nf.parse(str));
    }
}

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

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

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

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

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

Пример 5. Неконтролируемое исключения StackOverflowError

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

Пример 6. Неконтролируемое исключения ClassCastException

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

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

Пример 7. Неконтролируемое исключения NullPointerException

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

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

  • Throwable 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-объекта.
Read also:
Comments