1.03M
Категория: ПрограммированиеПрограммирование

Exceptions. Определение

1.

Exceptions
Исключения

2.

Ившуков
Сергей
Васильевич
Старший эксперт по технологиям
В SberTech с 2016 года
Разработка Platform V

3.

Определение
Исключение - это проблема(ошибка) возникающая во время
выполнения программы.
Варианты возникновения:
1.
Пользователь ввел некорректные данные.
2.
Файл, к которому обращается программа, не найден.
3.
Сетевое соединение с сервером было утеряно во время передачи
данных.
И так далее

4.

Пример
Exception in thread "main" java.lang.NullPointerException
at ru.sbt.education.ASimpleExmple.main(ASimpleExmple.java:9)

5.

java.lang.NullPointerException

6.

Иерархия исключений
Error, Exception, RuntimeException
checked/unchecked исключения

7.

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

8.

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

9.

Проверяемые исключения (checked)
Exception и его наследники, кроме RuntimeException и его подтипов.
Проверяются компилятором на этапе компиляции
Должны быть перехвачены в явном виде блоком catch или указаны в
объявлении метода с помощью ключевого слова throws
IOException
EOFException
FileNotFoundException
SQLException

10.

Непроверяемые исключения (unchecked)
Error, RuntimeException и все его подтипы.
Компилятор не контролирует непроверяемые исключения во время компиляции
Возникают во время выполнения программы вследствие ошибок в ее коде
(например, деление на нуль) или исчерпания системных ресурсов.
Необязательно должны обрабатываться
Необязательно должны указываться в объявлении метода
NullPointerException
IllegalArgumentException
IndexOutOfBoundsException
ArrayIndexOutOfBoundsExcepti
on
DataTimeException
NumberFormatException
ArithmeticException
ClassCastException
OutOfMemoryError
StackOverflowError

11.

Ключевые слова
try, catch, finally

12.

Try - catch
Шаблон записи

13.

Try - catch
Пример, отлавливающий исключение
Строка str равна null

14.

Try - catch
Пример, без отлавливания исключения
false

15.

Try - catch - finally

16.

Try - catch - finally
Пример, отлавливающий исключение
Строка str равна null
str = null

17.

Try - catch - finally
Пример, без отлавливания исключения
false
str = Строка

18.

Когда finally не выполнится

19.

Ключевые слова
throw, throws

20.

Throw
java.lang.ApplicationShutdownHooks#remove

21.

Throws

22.

Throws
Ошибка компиляции
java: unreported exception java.nio.file.AccessDeniedException; must be caught or declared to be thrown

23.

Вариант 1
Пробросить исключение выше
Ошибка выполнения
Exception in thread "main" java.nio.file.AccessDeniedException: Нет прав для чтения файла
at ru.sbt.education.AccessChecker.check(AccessChecker.java:9)
at ru.sbt.education.AThrows.main(AThrows.java:13)

24.

Вариант 2
Обработать исключение

25.

Несколько Throws

26.

Вариант 1
21:39:50,949 ERROR main AThrows2:main:23 - К файлу нет доступа. Ошибка:
java.nio.file.AccessDeniedException: Нет прав для чтения файла
at ru.sbt.education.FileChecker.check(FileChecker.java:10)
at ru.sbt.education.AThrows2.main(AThrows2.java:20)

27.

Вариант 2
21:44:11,815 ERROR main AThrows2:main:41 - К файлу нет доступа или он не существует. Ошибка:
java.nio.file.AccessDeniedException: Нет прав для чтения файла
at ru.sbt.education.FileChecker.check(FileChecker.java:10)
at ru.sbt.education.AThrows2.main(AThrows2.java:38)

28.

Порядок catch
Ошибка компиляции
java: exception java.nio.file.AccessDeniedException has already been caught

29.

Try-with-resources

30.

Try-with-resources
try-catch-finally при работе с ресурсами

31.

Try-with-resources
Лаконичная запись try-with-resources

32.

Собственный класс исключения

33.

Определение собственного класса
исключения
Чтобы создать проверяемое исключение, новый класс должен расширить,
непосредственно или посредственно класс Exception
Чтобы создать непроверяемое исключение, новый класс должен
расширить, непосредственно или посредственно класс RuntimeException
Создаваемый класс-исключение в названии, в конце должен содержать
Exception Примеры: MyException, CustomException
Созданное исключение должно по меньшей мере определить два
конструктора: один без аргументов, а другой с аргументом сообщения об
ошибке.

34.

Определение собственного класса
исключения
Пример

35.

Тестирование исключений

36.

Тестирование исключений

37.

Тестирование исключений
package ru.sbt.education;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.io.File;
import java.nio.file.AccessDeniedException;
import static org.testng.Assert.*;
public class FileCheckerTest {
@Mock
private File file;
@InjectMocks
private FileChecker fileChecker;
@BeforeTest
public void init(){
MockitoAnnotations.openMocks(this);
}
@Test(expectedExceptions = AccessDeniedException.class,
expectedExceptionsMessageRegExp = "Нет прав для чтения файла")
public void testCheckAccessDeniedException() throws AccessDeniedException {
Mockito.doReturn(false).when(file).canRead();
}
}
fileChecker.check(file);
package ru.sbt.education;
import java.io.File;
import java.io.FileNotFoundException;
import java.nio.file.AccessDeniedException;
class FileChecker {
public void check(File file) throws
AccessDeniedException {
if (!file.canRead()) {
throw new AccessDeniedException("Нет
прав для чтения файла");
}
}
}

38.

Рекомендации при обработке
исключений

39.

Рекомендации при обработке
исключений
Не надо подавлять исключения при обработке
Где должна быть ошибка пользоваться исключением, нужно проявлять
твердость вместо терпимости
Не заменять проверку исключением

40.

Рекомендации при обработке
исключений
Не надо подавлять исключения при обработке

41.

Рекомендации при обработке
исключений
Где должна быть ошибка пользоваться исключением, проявлять твердость
вместо терпимости
Не надо:
Надо:

42.

Рекомендации при обработке
исключений
Обработка исключения не может заменить собой проверку
Не надо:
Надо:

43.

Homework
Написать, программу, которая считает произведение только четных чисел. Ввод нечетных
чисел является ошибкой(исключением), НО результатом программы должно быть
произведение чисел либо сообщение, что число/числа, введенные пользователем нечетные.
1.
Написать свой класс checked исключения (имя придумать самим).
2.
Написать класс, метод которого принимает два числа, результат метода - их
произведение.
3.
Внутри метода проверять аргументы на четность, иначе выбрасывать исключение из п.1
4.
Написать программу, которая принимает на ввод от пользователя 2 числа.
5.
Вызвать метод объекта из п.2, обработать правильно исключение – при вводе нечетного
числа выводить, что число нечетное.
6.
Дополнительно: при любом результате в конце вывести сообщение об окончании работы
программы (использовать finally).
7.
Написать тест для класса из п.2, протестировать выбрасываемое исключение.

44.

Homework
Пример вывода:
English     Русский Правила