Простой пример обработки исключений JavaРассмотрим простой пример, демонстрирующий перехват и обработ­ку исключения. Как известно, попытка обратиться за границы массива приво­дит к ошибке, и виртуальная машина Java генерирует соответствующее исключение ArrayindexOutOfBoundsException.

Ниже приведен код программы, в которой наме­ренно создаются условия для появления данного исключения, которое затем перехва­тывается.

// Демонстрация обработки исключений

class ExcDemol {
	
	public static void main(String args) {
		int nums[] = new int[4];
		
		try {
			
			System.out.println("Дo генерации исключения");
			nums[10] = 300;
			System.out.println("Этa строка не будет отображаться");
			
		} catch(ArrayIndexOutOfBoundsException ехс) {
			System.out.println("Bыxoд за границы массива!");
		}
		System.out.println("Пocлe оператора catch");
	}
	
}

Результат выполнения данной программы выглядит следующим образом:

До генерации исключения
Выход за границы массива!
После оператора catch

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

Следовательно, явного обращения к блоку catch не происходит, но переход к нему осуществляется лишь при определенном условии, возникающем в ходе выполнения программы. Так, оператор вызова метода println(), следующий за выражением, в котором происходит обращение к несуществующему элементу массива, вообще не может быть выполнен.

При выходе из блока catch выполнение программы продолжается с оператора, следующего за этим блоком. Таким образом, обработчик исключений предназначен для устранения про­граммных ошибок, приводящих к исключительным ситуациям, а также для обеспечения нормального продолжения выполняемой программы.

Как упоминалось выше, в отсутствие появления исключений в блоке try операторы в блоке catch управления не получают, и выполнение программы продолжается послеблока catch. Для того чтобы убедиться в этом, замените в предыдущей программе стро­ку кода:

nums[10] = 300;

следующей строкой:

nums[0] = 300;

Теперь исключение не возникнет и блок catch не выполнится.

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

Исключения, возникающие в вызываемом методе, перехва­тываются операторами в блоке catch, связанном с блоком try. Правда, это произойдет лишь в том случае, если метод не обрабатывает исключения самостоятельно. Рассмо­трим в качестве примера следующую программу.

/* Исключение может быть сгенерировано одним методом, а перехвачено другим */

class ExcTest {
	// Генерация исключения
	static void genException() {
		
		int nums[] = new int[4];
		System.out.println("Дo генерации исключения");
		// Сгенерировать исключение в связи с
		// выходом индекса за границы массива
		
		nums[7] = 10;
		System.out.println("Этa строка не будет отображаться");
	}
}

class ExcDemo2 {
	public static void main (String args []) {
		try {
			ExcTest.genException();
		}
		// А здесь исключение перехватывается
		catch (ArrayIndexOutOfBoundsException ехс) {
			System.out.println("Bыxoд за границы массива!");
		}
		System.out.println("Пocлe оператора catch");
	}
}

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

Метод genException() вызывается из блока try, и поэтому генерируемое, но не пе­рехватываемое в нем исключение перехватывается далее в блоке catch, находящемся в методе main(). Если бы метод genException() сам перехватывал исключение, оно во­обще не достигло бы метода main().