Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Java.doc
Скачиваний:
17
Добавлен:
07.09.2019
Размер:
569.34 Кб
Скачать

Типы исключений

Реализующая иерархия классов исключений представляется:

Два непосредственных наследника класса Throwable делят иерархию подклассов исключений на две ветви. Суперкласс первой ветви – класс Ехception. Он используется для описания исключительных ситуации, которые должны перехватываться программным кодом пользователя. Другая ветвь (класс Error) предназначена для описания исключительных ситуаций, которые при обычных условиях не должны перехватываться в пользовательской программе.

Пример неперехваченного исключения можно продемонстрировать на примере деления на ноль. Объекты-исключения автоматически создаются исполняющей средой Java в результате возникновения данного исключительного состояния.

Типом исключения не Exception и не Throwable. Это подкласс ArithmeticException класса Exception, поясняющий, какая ошибка возникла при выполнении программы. В следующей программе возникает та же исключительная ситуация, но не в main а функции другого класса.

В результате работы этой программы обработчик исключений исполняющей системы Java выводит содержимое всего стека вызовов.

Все такие исключения, которые создаются в методе (кроме RuntimeException, Error и их подклассов), должны быть объявлены в предложении throws в заголовке метода, для них должны быть предусмотрены блоки cath в вызывающем блоке. Формат:

Тип_метода имя_метода (список параметров) trows список исключений

исключения описаны внутри пакета java.lang, который неявно импортирован во все классы программы. Большинство исключений класса RuntineException и подклассов Exception встроены (доступны автоматически). Они не компилируются (не проверяются) компилятором и именуются неконтролируемыми исключениями.

Другие, такие как ClassNotFoundException (класс не найден), NoSuchFildException, NoSuchMothodException и др.( такой метод не существует) (контролируемые) должны быть внесены в список trows, если метод может генерировать какое-то из них, но не обрабатывает его (смотри Help).

Собственные подклассы исключений можно создавать наследованием (extends) от класса Exception, получая таким образом доступ к методам, класса Throwable.

Архитектурный домен подклассов Throwable

Cтруктура определения подкласса класса Exception:

Class MyExceptionOne exetends Exception

{объявление переменных

MyException One() {........}// конструктор для инициализации переменных: //методы класса ….

}.

Если исключение не обрабатывается в программе. То оно захватывается обработчиком по умолчанию, определенным в Java. Стандартная обработка: выдача строки, описывающей исключение и распечатка трассы, откуда произошло исключение. (фактически описание имени файла и номера строки подпрограммы и т.д.). Выдается так же тип выбрасываемого исключения.

Несколько разделов catch

В некоторых случаях один и тот же блок программного кода может воз-буждать исключения различных типов. Для того, чтобы обрабатывать по-добные ситуации, Java позволяет использовать любое количество catch-разделов для try-блока. Наиболее специализированные классы исключений должны идти первыми, поскольку ни один подкласс не будет достигнут, если поставить его после суперкласса. Следующая про-грамма перехватывает два различных типа исключений, причем за этими двумя специализированными обработчиками следует раздел catch общего назначения, перехватывающий все подклассы класса Throwable.

class MultiCatch {

public static void main(String args[]) {

try {

int a = args.length;

System.out.println("a = " + a);

int b = 42 / a;

int c[] = { 1 };

c[42] = 99;

}

catch (ArithmeticException e) {

System.out.println("div by 0: " + e);

}

catch(ArrayIndexOutOfBoundsException e) {

System.out.println("array index oob: " + e);

}

}

}

Этот пример, запущенный без параметров, вызывает возбуждение ис-ключительной ситуации деления на нуль. Если же мы зададим в командной строке один или несколько параметров, тем самым установив а в значение боль-ше нуля, наш пример переживет оператор деления, но в следующем опе-раторе будет возбуждено исключение выхода индекса за границы масси-ва ArrayIndexOutOf Bounds. Ниже приведены результаты работы этой программы, за-пущенной и тем и другим способом.

С:\> java MultiCatch

а = 0

div by 0: java.lang.ArithmeticException: / by zero

C:\> java MultiCatch 1

a = 1

array index oob: java.lang.ArrayIndexOutOfBoundsException: 42

Вложенные операторы try

Операторы try можно вкладывать друг в друга аналогично тому, как можно создавать вложенные области видимости переменных. Если у оператора try низкого уровня нет раздела catch, соответствующего возбужденному исключению, стек будет развернут на одну ступень выше, и в поисках подходящего обработчика будут прове-рены разделы catch внешнего оператора try. Вот пример, в котором два оператора try вложены друг в друга посредством вызова метода.

class MultiNest {

static void procedure() {

try {

int c[] = { 1 };

c[42] = 99;

}

catch(ArrayIndexOutOfBoundsException e) {

System.out.println("array index oob: " + e);

}

}

public static void main(String args[]) {

try {

int a = args.length();

System.out.println("a = " + a);

int b = 42 / a;

procedure();

}

catch (ArithmeticException e) {

System.out.println("div by 0: " + e);

}

}

}

throw

Оператор throw используется для возбуждения исключения <вруч-ную>. Для того, чтобы сделать это, нужно иметь объект подкласса клас-са Throwable, который можно либо получить как параметр оператора catch, либо создать с помощью оператора new. Ниже приведена общая форма оператора throw.

throw ОбъектТипаThrowable;

При достижении этого оператора нормальное выполнение кода немед-ленно прекращается, так что следующий за ним оператор не выполня-ется. Ближайший окружающий блок try проверяется на наличие соот-ветствующего возбужденному исключению обработчика catch. Если такой отыщется, управление передается ему. Если нет, проверяется следующий из вложенных операторов try, и так до тех пор пока либо не будет най-ден подходящий раздел catch, либо обработчик исключений исполняю-щей системы Java не остановит программу, выведя при этом состояние стека вызовов. Ниже приведен пример, в котором сначала создается объект-исключение, затем оператор throw возбуждает исключительную ситуацию, после чего то же исключение возбуждается повторно - на этот раз уже кодом перехватившего его в первый раз раздела catch.

class ThrowDemo {

static void demoproc() {

try {

throw new NullPointerException("demo");

}

catch (NullPointerException e) {

System.out.println("caught inside demoproc");

throw e;

}

}

public static void main(String args[]) {

try {

demoproc();

}

catch(NulPointerException e) {

System.out.println("recaught: " + e);

}

}

}

В этом примере обработка исключения проводится в два приема. Метод main создает контекст для исключения и вызывает demoproc. Метод demoproc также устанавливает контекст для обработки исключе-ния, создает новый объект класса NullPointerException и с помощью опе-ратора throw возбуждает это исключение. Исключение перехватывается в следующей строке внутри метода demoproc, причем объект-исключение доступен коду обработчика через параметр e. Код обработчика выводит сообщение о том, что возбуждено исключение, а затем снова возбуждает его с помощью оператора throw, в результате чего оно передается обра-ботчику исключений в методе main. Ниже приведен результат, получен-ный при запуске этого примера.

С:\> java ThrowDemo

caught inside demoproc

recaught: java.lang.NullPointerException: demo

throws

Если метод способен возбуждать исключения, которые он сам не об-рабатывает, он должен объявить о таком поведении, чтобы вызывающие методы могли защитить себя от этих исключений. Для задания списка исключений, которые могут возбуждаться методом, используется ключе-вое слово throws. Если метод в явном виде (т.е. с помощью оператора throw) возбуждает исключе-ние соответствующего класса, тип класса исключений должен быть ука-зан в операторе throws в объявлении этого метода. С учетом этого наш прежний синтаксис определения метода должен быть расширен следую-щим образом:

тип имя_метода(список аргументов) throws список_исключений {}

Ниже приведен пример программы, в которой метод procedure пыта-ется возбудить исключение, не обеспечивая ни программного кода для его перехвата, ни объявления этого исключения в заголовке метода. Такой программный код не будет оттранслирован.

class ThrowsDemo1 {

static void procedure() {

System.out.println("inside procedure");

throw new IllegalAccessException("demo");

}

public static void main(String args[]) {

procedure();

}

}

Для того, чтобы мы смогли оттранслировать этот пример, нам при-дется сообщить транслятору, что procedure может возбуждать исключе-ния типа IllegalAccessException и в методе main добавить код для обработки этого типа исключений :

class ThrowsDemo {

static void procedure() throws IllegalAccessException {

System.out.println(" inside procedure");

throw new IllegalAccessException("demo");

}

public static void main(String args[]) {

try {

procedure();

}

catch (IllegalAccessException e) {

System.out.println("caught " + e);

}

}

}

Ниже приведен результат выполнения этой программы.

С:\> java ThrowsDemo

inside procedure

caught java.lang.IllegalAccessException: demo

Оператор finally.

Используется для устранения негативных последствий после появления исключительных ситуаций. Он располагается после оператора catch. Так, если, например, файл открыт и из него неверно прочитана запись, то возникает исключительная ситуация, после обработки которой необходимо осуществить некоторые действия по восстановлению работоспособности (например, закрыть сбойный файл).

В этом случае метод для закрытия этого файла вызывается в блоке finally.

Следует учесть, что finally выполняется всегда, независимо от того, что произошло в блоке try.

Если в блоке генерируется исключительная ситуация, передаваемая на обработку за пределы данного метода, а затем в finally генерируется другая исключительная ситуация, то при выполнении программы в среде первая из них будет потеряна, что может быть источником проблем в приложении.

class Except1 extends Exception

{ public String toString()

{

return " * exception1 *";

}

}

class Except2 extends Except1

{ public String toString()

{

return " * exception2 *";

}

}

class Except3 extends Except2

{ public String toString()

{

return " * exception3 *";

}

}

class A

{

void fun() throws Except1,Except3

{

throw new Except2();

}

}

public class Exep1

{

static int count = 0;

public static void main(String[] args)

{

while(true)

{

try

{

System.err.println("count = "+count);

A ob= new A();

if(count == 0) ob.fun();

if(count == 2) throw new Except1(); // Пост-инкремент, вначале равен нулю:

System.out.println("No exception");

}

catch(Except1 e)

{

System.err.println("Exception---> "+e.toString());

}

finally

{

System.err.println("== finally bloc ==\n");

if(count == 4) break; // выйти из "while"

count++;

}

}

}

}

Java - объектно-ориентированный язык 2

Виртуальная Java-машина. 2

Некоторые особенности Java от С++ 3

Алфавит языка Java 4

Типы данных 4

Числа высокой точности 6

Переменные в Java 6

Объявление переменной 6

Область действия и время жизни переменной 7

Операции в Java 7

Арифметические операции 8

Логические операции 8

Побитовые операции 9

Операции сдвига 9

Тернарный оператор ?: 10

Оператор запятая 10

Одномерные массивы 10

Многомерные массивы 12

Функции 12

Класс 13

Поля и методы 13

Модификаторы доступа 14

Инициализация и очистка 15

Перегрузка методов 15

Ключевое слово this 16

Вызов конструктора из конструктора 17

Использование объектов в качестве параметров 18

Ключевое слово static 19

Спецификатор final 20

Вложенные и внутренние классы 20

Сборщик «мусора» 21

Как работает сборщик мусора 21

Наследование 25

Основы наследования 25

Использование ключевого слова super 27

Использование super для вызова конструктора суперкласса 27

Использование super для доступа к скрытым членам суперкласса 29

Конструкторы при наследовании 30

Динамическая диспетчеризация методов 31

Абстрактные классы 32

Использование final с наследованием 34

Использование final для отказа от переопределения 34

Использование final для отмены наследования 34

Класс Object 35

Пакеты и интерфейсы 35

Пакеты 35

Оператор package 35

Оператор import 36

Уровни доступа. 38

Интерфейсы 38

Оператор implements 39

Частичные реализации 42

“Множественное” наследование в Java 42

Конфликты имен при комбинировании интерфейсов 44

Расширение интерфейса 44

Группировка констант 45

Инициализирование полей в интерфейсах 47

Вложенные интерфейсы 47

Стандартный ввод/вывод 50

Чтение из стандартного ввода 50

Замена System.out на PrintWriter 51

Первое приложение Java 51

Исключительные ситуации. Обработка исключений 51

Типы исключений 52