SlideShare ist ein Scribd-Unternehmen logo
1 von 64
Ошибки и исключения
Виталий Унгурян
unguryan@itstep.org
Исключения = ошибки?
Пример
class Main {
public static void main(String[] args) {
int a = 4;
System.out.println(a / 0);
}
}
NaN
К операциям, приводящим к появлению
NaN в качестве ответа, относятся:
все математические операции,
содержащие NaN в качестве одного из
операндов;
деление дробного числа на нуль;
деление бесконечности на
бесконечность;
NaN
умножение нуля на бесконечность;
сложение бесконечности с
бесконечностью противоположного
знака;
вычисление квадратного корня
отрицательного числа[1]
;
логарифмирование отрицательного
числа.
Бесконечности
POSITIVE_INFINITY – положительная
бесконечность
NEGATIVE_INFINITY – отрицательная
бесконечность.
Что такое исключительная ситуация?
«Исключительная ситуация»
(исключение, прерывание, exception) –
это ситуация которая возникает во
время выполнения вышей программы и
требует специальной обработки.
Исключения это объекты
В языке Java исключения
(Exceptions) и ошибки (Errors)
являются объектами. Когда метод
вызывает (бросает - throws)
исключительную ситуацию, он на
самом деле работает с объектом.
Упрощённая диаграмма классов
Throwable
Throwable — базовый
класс для всех
исключительных
ситуаций.
Методы класса Throwable
public String toString()
Краткое сообщение о исключении.
public String getMessage()
Полное сообщение о исключении.
public void printStackTrace(PrintStream s)
public void printStackTrace(PrintWriter s)
Выдача в стандартный или указанный поток
полной информации о точке возникновения
исключения.
Error
Error — базовый класс для
исключительных ситуаций,
вызванных серьёзными
сбоями в работе
виртуальной машины Java.
Error
Error — базовый класс для
исключительных ситуаций, вызванных
серьёзными сбоями в работе
виртуальной машины Java. Если
возникла исключительная ситуация
типа Error, то возможность
продолжения работы программы
сомнительна — нужно прекращать
работу программы и, возможно,
переинсталлировать Java.
Exception
Exception — это базовый
класс для всех тех
исключений, с которыми мы
имеем дело в программах.
Exception
Например, IOException порождён от
Exception и может генерироваться
различными методами библиотеки
ввода/вывода.
В свою очередь, для более точной
спецификации исключений, от
IOException порождены другие классы
исключений, такие, например, как
FileNotFoundException.
RuntimeException
Все классы порождённые от
Exception кроме тех, которые
порождены от
RuntimeException) обязаны быть
перехвачены.
Транслятор Java жёстко
контролирует это.
Контролируемые (checked)
Контролируемые исключения
представляют собой ошибки, которые
можно и нужно обрабатывать в
программе, к этому типу относятся все
потомки класса Exception (кроме
RuntimeException и его наследников).
Обработка исключений.
Обработка исключения может
быть произведена с помощью
операторов try…catch, либо
передана внешней части
программы.
Конструкция try … catch
try{
//здесь код, который потенциально може
т привести к ошибке
}
catch(SomeException e ){
//в скобках указывается класс конкретно
й ожидаемой ошибки. Здесь описывают
ся действия, направленные на обработк
у исключений
}
Множество блоков catch
Как происходит выбор
«правильного» catch? Да очень
просто — JVM идет сверху-вниз
до тех пор, пока не найдет
такой catch что в нем указано
ваше исключение или его
предок — туда и заходит. Ниже
— не идёт
Множество блоков catch
Выбор catch осуществляется в
runtime (а не в compile-time),
значит учитывается не тип
ССЫЛКИ (Throwable), а тип
ССЫЛАЕМОГО (Exception)
try + finally
finally-секция получает управление,
если try-блок завершился или если
был директивыный выход (return).
finally-секция НЕ вызывается
только если вызвать
System.exit(42);
finally-секция
finally-секция может
«перебить» throw/return
при помощи другого
throw/return
Гарантированное завершение
finally-секция может быть использована для
завершающего действия, которое
гарантированно будет вызвано (даже если
было брошено исключение или автор
использовал return) по окончании работы
// open some resource
try { // use resource }
finally { // close resource }
Специально для этих целей в Java 7
появилась конструкция try-with-resources
Не рекомендуемые практики
— return из finally-секции (можем
затереть исключение из try-блока)
— действия в finally-секции,
которые могут бросить исключение
(можем затереть исключение из try-
блока)
Неконтролируемые (unchecked)
Неконтролируемые исключения не
требуют обязательной обработки,
однако, при желании, можно
обрабатывать исключения класса
RuntimeException.Эти исключения
могут возникнуть в любом месте
программы.
Когда нужно бросать исключения?
Чаще всего Exceptions бросаются при
нарушении контракта метода. Контракт
(contract) - это негласное соглашение
между создателем метода (метод
сделает и/или вернет именно то, что
надо) и пользователем метода (на вход
метода будут передаваться значения из
множества допустимых).
Как бросать исключение?
Бросание исключения (ошибки ) – это
создание объекта исключения, с
помощью ключевого слова throw
throw new IllegalStateException();
throw new String(“Ошибка”);
throw new null;
throw и new
throw и new — это две независимых
операции.
public static void main(String[] args) {
// создаем экземпляр
Error ref = new Error();
// "бросаем" его
throw ref;
}
Передача наверх
public void test(int a) throws Exception {
if (a < 0) {
throw new Exception(“a<0”);
}
}
Пессимистичный механизм
Можно назвать связь между
проверяемыми исключениями и
throws — «пессимистичной», польку
мы можем «напугать» о большем,
чем может произойти на самом
деле, но не наоборот.
Мы не можем бросать, но предупредить
о «меньшем»
public static void main(String[] args)
throws IOException {
throw new Exception();
}
Волки, волки
Можно предупредить даже о том,
чего быть не может.
public static void main(String[] args)
throws Exception {
return;
}
Даже если предупреждаем о том, чего
нет — все обязаны бояться.
Испугавшиеся могут перепугать
остальных ещё больше
public class App {
// они пугают целым Throwable
public static void main(String[] args)
throws Throwable {
f();
} // хотя мы пугали всего - лишь Exception
public static void f() throws Exception { } }
Если вы часть перехватили, то можете
этим уже не пугать
public static void main(String[] args) throws
FileNotFoundException {
try {
if (System.currentTimeMillis() % 2 == 0) {
throw new EOFException(); }
else {
throw new FileNotFoundException(); } }
catch (EOFException e) { // ... } }
В чем цель «пессимистичности»?
Вы в режиме протипирования
«набросали», скажем, класс-утилиту
для скачивания из интернета и хотели
бы «принудить» пользователей вашего
класса УЖЕ ОБРАБАТЫВАТЬ
возможное исключение IOException,
хотя из реализации-пустышки вы ПОКА
НЕ ГЕНЕРИРУЕТЕ такое исключение.
Но в будущем — собираетесь.
Множественные исключения
public static void main(String[] args) throws
EOFException, FileNotFoundException
{
if (System.currentTimeMillis() % 2 == 0) {
throw new EOFException(); }
else {
throw new FileNotFoundException();
}
}
System.err
Когда Вы пишете в System.err — ваше
сообщение тут же выводится на
консоль, но когда пишете в System.out,
то оно может на какое-то время быть
буферизировано Stacktrace
необработанного исключение
выводится через System.err, что
позволяет им обгонять «обычные»
сообщения.
Возвращение значений
Компилятор требует вернуть результат
(или требует молчать).
Если в объявлении метода сказано, что
он возвращает НЕ void, то компилятор
зорко следит, что бы мы вернули
экземпляр требуемого типа или
экземпляр типа, который можно неявно
привести к требуемому
Возвращение значений
public static double sqr(double arg) {
if (System.currentTimeMillis() % 2 == 0)
{
return arg * arg;
}
// а если число нечётное, что
возвращать?
}
Возвращение значений
public class App {
public static double sqr(double arg) {// согласно объявлению
метода ты должен вернуть double
long time = System.currentTimeMillis();
if (time % 2 == 0) {
return arg * arg; // ок, вот твой double }
else if (time % 2 == 1) {
{
while (true); // не, я решил "повиснуть" }
else {
throw new RuntimeException(); // или бросить исключение
} } }
Практика
Вычисляем площадь прямоугольника.
public static int area(int width, int height)
{
return width * height;
}
Решение
public static int area(int width, int height) {
if (width < 0 || height < 0) {
throw new
IllegalArgumentException( "Negative
sizes: w = " + width + ", h = " + height);
}
return width * height;
}
Вложенные try catch
Допускается вложение
конструкции try … catch в
друг друга.
Нелокальная передача управления
(nonlocal control transfer)
Механизм исключительных ситуация
(исключений) — это механизм
НЕЛОКАЛЬНОЙ ПЕРЕДАЧИ
УПРАВЛЕНИЯ.
Что под этим имеется в виду?
Нелокальная передача управления
Программа, в ходе своего выполнения
(точнее исполнения инструкций в
рамках отдельного потока), оперирует
стеком («стопкой») фреймов. Передача
управления осуществляется либо в
рамках одного фрейма, либо передача
управления происходит в «стопке»
фреймов между СОСЕДНИМИ
фреймами
Нелокальная передача управления
Нелокальная передача управления
Программа, в ходе своего выполнения
(точнее исполнения инструкций в
рамках отдельного потока), оперирует
стеком («стопкой») фреймов. Передача
управления осуществляется либо в
рамках одного фрейма, либо передача
управления происходит в «стопке»
фреймов между СОСЕДНИМИ
фреймами
Магия исключений 1
Механизм исключительных ситуация в Java
связан с двумя элементами «магии», т.е.
поведения, которое никак не отражено в
исходном коде:
java.lang.Throwable — в throw, catch и
throws могут стоять исключительно
Throwable или его наследники Это
«право» находиться в throw, catch и
throws никак не отражено в исходном
коде.
Магия исключений 2
Все исключительные ситуации делятся
на «проверяемые» (checked) и
«непроверяемые» (unchecked). Это
свойство присуще «корневищу»
(Throwable, Error, Exception,
RuntimeException) и передается по
наследству. Никак не видимо в
исходном коде класса исключения.
Overriding и throws
public class Parent {
public void f() throws IOException,
InterruptedException {
}
}
Overriding и throws
class Child extends Parent {
@Override
public void f() throws
FileNotFoundException {
}
} При переопределении (overriding) список
исключений потомка не обязан совпадать с
таковым у предка.
Но он должен быть «не сильнее» списка предка
Overriding и throws
При переопределении
(overriding) список исключений
потомка не обязан совпадать с
таковым у предка.
Но он должен быть «не
сильнее» списка предка
Почему можно сужать тип, но не
расширять?
Если бы потомок мог расширять
тип бросаемого исключения предка,
то те места которые «ждут» предка,
а получают экземпляр
«расширенного» потомка могли бы
неконтролируемо выбрасывать
проверяемые исключения
Передача свойства по наследству
Логика расположения свойства НЕ
СВЯЗАНА С НАСЛЕДОВАНИЕМ.
Однако свойство checked/unchecked
пользовательских классов исключений
строится ИСКЛЮЧИТЕЛЬНО НА
ОСНОВЕ НАСЛЕДОВАНИЯ.
Правило передачи свойств
Правило крайне простое:
1. Если исключение из списка
Throwable, Error, Exception,
RuntimeException — то твое свойство
надо просто запомнить.
2. Если ты не из списка, то твое
свойство равно свойству предка.
Нарушить наследование тут нельзя.
Правило передачи свойств
Правило передачи свойств
Поведение компилятора/JVM
проверка на cheched исключения
происходит в момент компиляции
(compile-time checking)
 перехват исключений (catch)
происходит в момент выполнения
(runtime checking)
Основные правила обработки исключений
Используйте исключения для того,
чтобы:
обработать ошибку на текущем
уровне (избегайте перехватывать
исключения, если не знаете, как с
ними поступить)
исправить проблему и снова вызвать
метод, возбудивший исключение
Основные правила обработки исключений
предпринять все необходимые
действия и продолжить выполнение
без повторного вызова действия
попытаться найти альтернативный
результат вместо того, который
должен был бы произвести
вызванный метод
Основные правила обработки исключений
завершить работу программы
упростить программу (если
используемая схема обработки
исключений делает все только
сложнее, значит, она никуда не
годится)
добавить вашей библиотеке и
программе безопасности
Основные правила обработки исключений
сделать все возможное в текущем
контексте и заново возбудить это же
исключение, перенаправив его на
более высокий уровень
сделать все, что можно в текущем
контексте, и возбудить новое
исключение, перенаправив его на
более высокий уровень

Weitere ähnliche Inhalte

Was ist angesagt?

Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Unguryan Vitaliy
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыUnguryan Vitaliy
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.Unguryan Vitaliy
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в javaUnguryan Vitaliy
 
Аннотации в java
Аннотации в javaАннотации в java
Аннотации в javaUnguryan Vitaliy
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в javaUnguryan Vitaliy
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью. Unguryan Vitaliy
 

Was ist angesagt? (8)

Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
 
десант презентация
десант презентациядесант презентация
десант презентация
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
 
Аннотации в java
Аннотации в javaАннотации в java
Аннотации в java
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 

Andere mochten auch

An Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in JavaAn Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in JavaAbhishek Asthana
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Unguryan Vitaliy
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииUnguryan Vitaliy
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.Unguryan Vitaliy
 
Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылокUnguryan Vitaliy
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Unguryan Vitaliy
 
Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьUnguryan Vitaliy
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Unguryan Vitaliy
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Unguryan Vitaliy
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировкиUnguryan Vitaliy
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Unguryan Vitaliy
 

Andere mochten auch (14)

An Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in JavaAn Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in Java
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
 
Java. Циклы.
Java. Циклы.Java. Циклы.
Java. Циклы.
 
Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылок
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
 
Uml
UmlUml
Uml
 
Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередь
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
 
List - списки
List - списки List - списки
List - списки
 

Ähnlich wie Исключения и ошибки

обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Javametaform
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
Исключительные ситуации
Исключительные ситуацииИсключительные ситуации
Исключительные ситуацииAlexey Bovanenko
 
05 Обработка Исключений
05 Обработка Исключений05 Обработка Исключений
05 Обработка Исключенийphearnot
 
Msu.Center.Lectures.J05 Handling Exceptions
Msu.Center.Lectures.J05 Handling ExceptionsMsu.Center.Lectures.J05 Handling Exceptions
Msu.Center.Lectures.J05 Handling Exceptionsolegol
 
Обработка ошибок и исключений
Обработка ошибок и исключенийОбработка ошибок и исключений
Обработка ошибок и исключенийitclub_kz
 
Базовые операторы Java
Базовые операторы JavaБазовые операторы Java
Базовые операторы Javametaform
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Alex Tumanoff
 
4. java lecture exceptions
4. java lecture exceptions4. java lecture exceptions
4. java lecture exceptionsMERA_school
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 

Ähnlich wie Исключения и ошибки (20)

обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
 
Exceptions
ExceptionsExceptions
Exceptions
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Исключительные ситуации
Исключительные ситуацииИсключительные ситуации
Исключительные ситуации
 
05 Обработка Исключений
05 Обработка Исключений05 Обработка Исключений
05 Обработка Исключений
 
Msu.Center.Lectures.J05 Handling Exceptions
Msu.Center.Lectures.J05 Handling ExceptionsMsu.Center.Lectures.J05 Handling Exceptions
Msu.Center.Lectures.J05 Handling Exceptions
 
Thread
ThreadThread
Thread
 
Обработка ошибок
Обработка ошибокОбработка ошибок
Обработка ошибок
 
Обработка ошибок и исключений
Обработка ошибок и исключенийОбработка ошибок и исключений
Обработка ошибок и исключений
 
Базовые операторы Java
Базовые операторы JavaБазовые операторы Java
Базовые операторы Java
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 
java
javajava
java
 
course js day 2
course js day 2course js day 2
course js day 2
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
4. java lecture exceptions
4. java lecture exceptions4. java lecture exceptions
4. java lecture exceptions
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 

Mehr von Unguryan Vitaliy

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование. Unguryan Vitaliy
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVCUnguryan Vitaliy
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектамиUnguryan Vitaliy
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версийUnguryan Vitaliy
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Unguryan Vitaliy
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoFUnguryan Vitaliy
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernateUnguryan Vitaliy
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в SpringUnguryan Vitaliy
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSPUnguryan Vitaliy
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействиеUnguryan Vitaliy
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологииUnguryan Vitaliy
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.Unguryan Vitaliy
 

Mehr von Unguryan Vitaliy (20)

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование.
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектами
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSP
 
JSTL
JSTLJSTL
JSTL
 
JSP
JSPJSP
JSP
 
JDBC
JDBCJDBC
JDBC
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
 
XML
XMLXML
XML
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 

Исключения и ошибки

  • 1. Ошибки и исключения Виталий Унгурян unguryan@itstep.org
  • 3. Пример class Main { public static void main(String[] args) { int a = 4; System.out.println(a / 0); } }
  • 4. NaN К операциям, приводящим к появлению NaN в качестве ответа, относятся: все математические операции, содержащие NaN в качестве одного из операндов; деление дробного числа на нуль; деление бесконечности на бесконечность;
  • 5. NaN умножение нуля на бесконечность; сложение бесконечности с бесконечностью противоположного знака; вычисление квадратного корня отрицательного числа[1] ; логарифмирование отрицательного числа.
  • 7. Что такое исключительная ситуация? «Исключительная ситуация» (исключение, прерывание, exception) – это ситуация которая возникает во время выполнения вышей программы и требует специальной обработки.
  • 8. Исключения это объекты В языке Java исключения (Exceptions) и ошибки (Errors) являются объектами. Когда метод вызывает (бросает - throws) исключительную ситуацию, он на самом деле работает с объектом.
  • 10.
  • 11. Throwable Throwable — базовый класс для всех исключительных ситуаций.
  • 12. Методы класса Throwable public String toString() Краткое сообщение о исключении. public String getMessage() Полное сообщение о исключении. public void printStackTrace(PrintStream s) public void printStackTrace(PrintWriter s) Выдача в стандартный или указанный поток полной информации о точке возникновения исключения.
  • 13. Error Error — базовый класс для исключительных ситуаций, вызванных серьёзными сбоями в работе виртуальной машины Java.
  • 14. Error Error — базовый класс для исключительных ситуаций, вызванных серьёзными сбоями в работе виртуальной машины Java. Если возникла исключительная ситуация типа Error, то возможность продолжения работы программы сомнительна — нужно прекращать работу программы и, возможно, переинсталлировать Java.
  • 15. Exception Exception — это базовый класс для всех тех исключений, с которыми мы имеем дело в программах.
  • 16. Exception Например, IOException порождён от Exception и может генерироваться различными методами библиотеки ввода/вывода. В свою очередь, для более точной спецификации исключений, от IOException порождены другие классы исключений, такие, например, как FileNotFoundException.
  • 17. RuntimeException Все классы порождённые от Exception кроме тех, которые порождены от RuntimeException) обязаны быть перехвачены. Транслятор Java жёстко контролирует это.
  • 18. Контролируемые (checked) Контролируемые исключения представляют собой ошибки, которые можно и нужно обрабатывать в программе, к этому типу относятся все потомки класса Exception (кроме RuntimeException и его наследников).
  • 19. Обработка исключений. Обработка исключения может быть произведена с помощью операторов try…catch, либо передана внешней части программы.
  • 20. Конструкция try … catch try{ //здесь код, который потенциально може т привести к ошибке } catch(SomeException e ){ //в скобках указывается класс конкретно й ожидаемой ошибки. Здесь описывают ся действия, направленные на обработк у исключений }
  • 21. Множество блоков catch Как происходит выбор «правильного» catch? Да очень просто — JVM идет сверху-вниз до тех пор, пока не найдет такой catch что в нем указано ваше исключение или его предок — туда и заходит. Ниже — не идёт
  • 22. Множество блоков catch Выбор catch осуществляется в runtime (а не в compile-time), значит учитывается не тип ССЫЛКИ (Throwable), а тип ССЫЛАЕМОГО (Exception)
  • 23. try + finally finally-секция получает управление, если try-блок завершился или если был директивыный выход (return). finally-секция НЕ вызывается только если вызвать System.exit(42);
  • 25. Гарантированное завершение finally-секция может быть использована для завершающего действия, которое гарантированно будет вызвано (даже если было брошено исключение или автор использовал return) по окончании работы // open some resource try { // use resource } finally { // close resource } Специально для этих целей в Java 7 появилась конструкция try-with-resources
  • 26. Не рекомендуемые практики — return из finally-секции (можем затереть исключение из try-блока) — действия в finally-секции, которые могут бросить исключение (можем затереть исключение из try- блока)
  • 27. Неконтролируемые (unchecked) Неконтролируемые исключения не требуют обязательной обработки, однако, при желании, можно обрабатывать исключения класса RuntimeException.Эти исключения могут возникнуть в любом месте программы.
  • 28. Когда нужно бросать исключения? Чаще всего Exceptions бросаются при нарушении контракта метода. Контракт (contract) - это негласное соглашение между создателем метода (метод сделает и/или вернет именно то, что надо) и пользователем метода (на вход метода будут передаваться значения из множества допустимых).
  • 29. Как бросать исключение? Бросание исключения (ошибки ) – это создание объекта исключения, с помощью ключевого слова throw throw new IllegalStateException(); throw new String(“Ошибка”); throw new null;
  • 30. throw и new throw и new — это две независимых операции. public static void main(String[] args) { // создаем экземпляр Error ref = new Error(); // "бросаем" его throw ref; }
  • 31. Передача наверх public void test(int a) throws Exception { if (a < 0) { throw new Exception(“a<0”); } }
  • 32. Пессимистичный механизм Можно назвать связь между проверяемыми исключениями и throws — «пессимистичной», польку мы можем «напугать» о большем, чем может произойти на самом деле, но не наоборот.
  • 33. Мы не можем бросать, но предупредить о «меньшем» public static void main(String[] args) throws IOException { throw new Exception(); }
  • 34. Волки, волки Можно предупредить даже о том, чего быть не может. public static void main(String[] args) throws Exception { return; } Даже если предупреждаем о том, чего нет — все обязаны бояться.
  • 35. Испугавшиеся могут перепугать остальных ещё больше public class App { // они пугают целым Throwable public static void main(String[] args) throws Throwable { f(); } // хотя мы пугали всего - лишь Exception public static void f() throws Exception { } }
  • 36. Если вы часть перехватили, то можете этим уже не пугать public static void main(String[] args) throws FileNotFoundException { try { if (System.currentTimeMillis() % 2 == 0) { throw new EOFException(); } else { throw new FileNotFoundException(); } } catch (EOFException e) { // ... } }
  • 37. В чем цель «пессимистичности»? Вы в режиме протипирования «набросали», скажем, класс-утилиту для скачивания из интернета и хотели бы «принудить» пользователей вашего класса УЖЕ ОБРАБАТЫВАТЬ возможное исключение IOException, хотя из реализации-пустышки вы ПОКА НЕ ГЕНЕРИРУЕТЕ такое исключение. Но в будущем — собираетесь.
  • 38. Множественные исключения public static void main(String[] args) throws EOFException, FileNotFoundException { if (System.currentTimeMillis() % 2 == 0) { throw new EOFException(); } else { throw new FileNotFoundException(); } }
  • 39. System.err Когда Вы пишете в System.err — ваше сообщение тут же выводится на консоль, но когда пишете в System.out, то оно может на какое-то время быть буферизировано Stacktrace необработанного исключение выводится через System.err, что позволяет им обгонять «обычные» сообщения.
  • 40. Возвращение значений Компилятор требует вернуть результат (или требует молчать). Если в объявлении метода сказано, что он возвращает НЕ void, то компилятор зорко следит, что бы мы вернули экземпляр требуемого типа или экземпляр типа, который можно неявно привести к требуемому
  • 41. Возвращение значений public static double sqr(double arg) { if (System.currentTimeMillis() % 2 == 0) { return arg * arg; } // а если число нечётное, что возвращать? }
  • 42. Возвращение значений public class App { public static double sqr(double arg) {// согласно объявлению метода ты должен вернуть double long time = System.currentTimeMillis(); if (time % 2 == 0) { return arg * arg; // ок, вот твой double } else if (time % 2 == 1) { { while (true); // не, я решил "повиснуть" } else { throw new RuntimeException(); // или бросить исключение } } }
  • 43. Практика Вычисляем площадь прямоугольника. public static int area(int width, int height) { return width * height; }
  • 44. Решение public static int area(int width, int height) { if (width < 0 || height < 0) { throw new IllegalArgumentException( "Negative sizes: w = " + width + ", h = " + height); } return width * height; }
  • 45. Вложенные try catch Допускается вложение конструкции try … catch в друг друга.
  • 46. Нелокальная передача управления (nonlocal control transfer) Механизм исключительных ситуация (исключений) — это механизм НЕЛОКАЛЬНОЙ ПЕРЕДАЧИ УПРАВЛЕНИЯ. Что под этим имеется в виду?
  • 47. Нелокальная передача управления Программа, в ходе своего выполнения (точнее исполнения инструкций в рамках отдельного потока), оперирует стеком («стопкой») фреймов. Передача управления осуществляется либо в рамках одного фрейма, либо передача управления происходит в «стопке» фреймов между СОСЕДНИМИ фреймами
  • 49. Нелокальная передача управления Программа, в ходе своего выполнения (точнее исполнения инструкций в рамках отдельного потока), оперирует стеком («стопкой») фреймов. Передача управления осуществляется либо в рамках одного фрейма, либо передача управления происходит в «стопке» фреймов между СОСЕДНИМИ фреймами
  • 50. Магия исключений 1 Механизм исключительных ситуация в Java связан с двумя элементами «магии», т.е. поведения, которое никак не отражено в исходном коде: java.lang.Throwable — в throw, catch и throws могут стоять исключительно Throwable или его наследники Это «право» находиться в throw, catch и throws никак не отражено в исходном коде.
  • 51. Магия исключений 2 Все исключительные ситуации делятся на «проверяемые» (checked) и «непроверяемые» (unchecked). Это свойство присуще «корневищу» (Throwable, Error, Exception, RuntimeException) и передается по наследству. Никак не видимо в исходном коде класса исключения.
  • 52. Overriding и throws public class Parent { public void f() throws IOException, InterruptedException { } }
  • 53. Overriding и throws class Child extends Parent { @Override public void f() throws FileNotFoundException { } } При переопределении (overriding) список исключений потомка не обязан совпадать с таковым у предка. Но он должен быть «не сильнее» списка предка
  • 54. Overriding и throws При переопределении (overriding) список исключений потомка не обязан совпадать с таковым у предка. Но он должен быть «не сильнее» списка предка
  • 55. Почему можно сужать тип, но не расширять? Если бы потомок мог расширять тип бросаемого исключения предка, то те места которые «ждут» предка, а получают экземпляр «расширенного» потомка могли бы неконтролируемо выбрасывать проверяемые исключения
  • 56. Передача свойства по наследству Логика расположения свойства НЕ СВЯЗАНА С НАСЛЕДОВАНИЕМ. Однако свойство checked/unchecked пользовательских классов исключений строится ИСКЛЮЧИТЕЛЬНО НА ОСНОВЕ НАСЛЕДОВАНИЯ.
  • 57. Правило передачи свойств Правило крайне простое: 1. Если исключение из списка Throwable, Error, Exception, RuntimeException — то твое свойство надо просто запомнить. 2. Если ты не из списка, то твое свойство равно свойству предка. Нарушить наследование тут нельзя.
  • 60. Поведение компилятора/JVM проверка на cheched исключения происходит в момент компиляции (compile-time checking)  перехват исключений (catch) происходит в момент выполнения (runtime checking)
  • 61. Основные правила обработки исключений Используйте исключения для того, чтобы: обработать ошибку на текущем уровне (избегайте перехватывать исключения, если не знаете, как с ними поступить) исправить проблему и снова вызвать метод, возбудивший исключение
  • 62. Основные правила обработки исключений предпринять все необходимые действия и продолжить выполнение без повторного вызова действия попытаться найти альтернативный результат вместо того, который должен был бы произвести вызванный метод
  • 63. Основные правила обработки исключений завершить работу программы упростить программу (если используемая схема обработки исключений делает все только сложнее, значит, она никуда не годится) добавить вашей библиотеке и программе безопасности
  • 64. Основные правила обработки исключений сделать все возможное в текущем контексте и заново возбудить это же исключение, перенаправив его на более высокий уровень сделать все, что можно в текущем контексте, и возбудить новое исключение, перенаправив его на более высокий уровень