Similar presentations:
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.NullPointerException6.
Иерархия исключений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 - finally16.
Try - catch - finallyПример, отлавливающий исключение
Строка str равна null
str = null
17.
Try - catch - finallyПример, без отлавливания исключения
false
str = Строка
18.
Когда finally не выполнится19.
Ключевые словаthrow, throws
20.
Throwjava.lang.ApplicationShutdownHooks#remove
21.
Throws22.
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.
Несколько Throws26.
Вариант 121: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.
Вариант 221: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-resources30.
Try-with-resourcestry-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Пример вывода: