Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3-й семестр / Лекции / 5 - Презентация 2

.pdf
Скачиваний:
58
Добавлен:
25.12.2020
Размер:
1.13 Mб
Скачать

Центр дистанционного обучения

Исключения

Когда генерировать unchecked exceptions?

При проверке входных параметров. Это является хорошим тоном, так как позволяет выдать более инфомативные сообщения об ошибках.

NullPointerException если параметр null, когда не должен быть

IndexOutOfBoundsException, когда параметр-индекс вне диапазона

IllegalArgumentException в случае остальных нарушений ограничений на параметры

Unchecked exceptions как правило указывают на ошибку программиста (неправильно переданные параметры).

online.mirea.ru

Центр дистанционного обучения

Исключения

Когда ловить unchecked exceptions?

Практически никогда. Если в программе происходит unchecked exception, это ошибка в программе, которую гужно исправить, чтобы исключение не возникало.

NumberFormatException – исключение. Это ошибка дизайна стандартной библиотеки Java, это исключение не должно быть unchecked.

online.mirea.ru

Центр дистанционного обучения

Исключения

Неправильно

Правильно

 

 

int[] array = {1, 2, 3, 4};

int[] array = {1, 2, 3, 4};

Scanner sc = new Scanner(System.in)

Scanner sc = new Scanner(System.in)

int index = sc.nextInt();

int index = sc.nextInt();

try {

if (index >= 0 && index < array.length) {

array[index] = 0;

array[index] = 0;

} catch (IndexOutOfBoundsException ex) {

} else {

System.err.println(“Неверный индекс”);

System.err.println(“Неверный индекс”);

}

}

 

 

Поэтому примеры выше с catch для unchecked exceptions – только для иллюстрации!

online.mirea.ru

Центр дистанционного обучения

Исключения

Почему? Потому что unchecked exception может произойти почти в любой строке программы.

int[] array = ...;

int index = ...;

try {

array[index] = array[index – 1] + array[index + 1];

doSomethingElse(array, index);

}catch (IndexOutOfBoundsException ex) {

//Какой именно из индексов вне диапазона?

}

online.mirea.ru

Центр дистанционного обучения

Исключения

Классы-наследники Exception, но не RuntimeException,

являются checked exceptions (проверяемые исключения).

try {

byte[] data = Files.readAllBytes(Paths.get(“file.txt”));

}catch (NoSuchFileException | FileNotFoundException ex) { System.err.println(“Файл не найден”);

}catch (IOException ex) {

System.err.println(ex.toString());

}

online.mirea.ru

Центр дистанционного обучения

Исключения

class IOException extends Exception { ... }

class FileNotFoundException extends IOException { ... }

class NoSuchFileException extends IOException { ... }

online.mirea.ru

Центр дистанционного обучения

Исключения

В try ... catch может быть несколько блоков catch. При этом срабатывает первый блок, под который подпадает сработавшее исключение. Поэтому сначала должны идти более специфичные, потом более общие исключения.

try {

byte[] data = Files.readAllBytes(Paths.get(“file.txt”));

}catch (IOException ex) { System.err.println(ex.toString());

}catch (NoSuchFileException | FileNotFoundException ex) {

//Сюда мы никогда не попадаем!

}

online.mirea.ru

Центр дистанционного обучения

Исключения

В блоке catch может быть указано несколько исключений. При этом тип переменной ex – их общий предок (всегда как минимум Throwable).

try {

byte[] data = Files.readAllBytes(Paths.get(“file.txt”));

}catch (NoSuchFileException | FileNotFoundException ex) { System.err.println(“Файл не найден”);

}catch (IOException ex) {

System.err.println(ex.toString());

}

online.mirea.ru

Центр дистанционного обучения

Исключения

Checked exceptions (проверяемые исключения) служат для сигнализации об ошибках, связанных с взаимодействием с внешним миром:

Неправильный формат входных данных программы

Отсутствие файла

Ошибка чтения файла

Ошибка записи файла (кончилось место на диске)

Такие ошибки нельзя обойти только действиями программиста, они должны быть обработаны либо пользователем программы, либо приводить к завершению работы программы/процесса.

online.mirea.ru

Центр дистанционного обучения

Исключения

Отличия checked exceptions (проверяемые исключения) от unchecked exceptions (непроверяемых исключений): если код, который может вызвать checked exception, не помещен в блок try ... catch, то компилятор обязывает вас добавить объявление throws в заголовок метода, в котором этот код находится:

public static byte[] readMyFile() throws IOException { byte[] data = Files.readAllBytes(Paths.get(“file.txt”)); return data;

}

Код, который вызывает readMyFile(), в свою очередь либо должен поместить вызов в try ... catch, либо добавить throws в свой метод.

online.mirea.ru