25
Обработка ошибок, исключения, отладка Алексей Владыкин 29 сентября 2014 Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 1 / 25

Java, осень 2014: Обработка ошибок, исключения, отладка

Embed Size (px)

DESCRIPTION

* Обзор подходов к обработке ошибок. * Исключения, типы исключений. * Конструкции try/catch/finally, try-with-resources, multicatch. * Java Logging API. * Использование отладчика.

Citation preview

Page 1: Java, осень 2014: Обработка ошибок, исключения, отладка

Обработка ошибок, исключения, отладка

Алексей Владыкин

29 сентября 2014

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 1 / 25

Page 2: Java, осень 2014: Обработка ошибок, исключения, отладка

1 Подходы к обработке ошибок

2 Исключения

3 Java Logging API

4 Отладка и диагностика

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 2 / 25

Page 3: Java, осень 2014: Обработка ошибок, исключения, отладка

Подходы к обработке ошибок

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 3 / 25

Page 4: Java, осень 2014: Обработка ошибок, исключения, отладка

Подходы к обработке ошибок

Ошибки игнорируются

При ошибке программа аварийно завершается

При ошибке функция вместо результата возвращает специальноезначение

Функция возвращает признак ошибки отдельным выходнымпараметром

Функция возвращает признак ошибки в глобальной переменной

При ошибке функция бросает исключение

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 4 / 25

Page 5: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Что такое «исключение»

Исключение (exception) — событие, возникающее в процессеработы программы и прерывающее её нормальное исполнение

Примеры:java.lang.NullPointerException

java.lang.ClassCastException

java.lang.OutOfMemoryError

java.io.IOException

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 5 / 25

Page 6: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Пример исключения

java.lang.NullPointerExceptionat ru.compscicenter.java2014.Test.baz(Test.java:19)at ru.compscicenter.java2014.Test.bar(Test.java:14)at ru.compscicenter.java2014.Test.foo(Test.java:10)at ru.compscicenter.java2014.Test.main(Test.java:6)

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 6 / 25

Page 7: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

java.lang.Throwable

Исключение в Java — полноценный объектВсе исключения в Java наследуются от класса Throwable

String getMessage()

StackTraceElement[] getStackTrace()

void printStackTrace()

Throwable getCause()

Throwable[] getSuppressed()

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 7 / 25

Page 8: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Классификация исключений

Исключительные ситуации в JVMjava.lang.Error

Исключительные ситуации в пользовательском коде

Проверяемые (checked)java.lang.Exception

Непроверяемые (unchecked)java.lang.RuntimeException

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 8 / 25

Page 9: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Выброс исключения

public class CalculatorImpl implements Calculator {@Overridepublic double calculate(String expr) {

if (expr == null) {throw new NullPointerException("expr is null");

}// or using utility method:// Objects.requireNonNull(expr , "expr is null ");// ...

}}

Оператор throw прерывает нормальное исполнение программы изапускает поиск обработчика исключенияЕсли исключение проверяемое, метод должен содержать его всписке throws

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 9 / 25

Page 10: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Объявление нового типа исключения

public class CalculatorException extends RuntimeException {

public CalculatorException(String message) {super(message );

}

public CalculatorException(String message , Throwable cause) {super(message , cause);

}}

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 10 / 25

Page 11: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Перехват исключения: try-catch

System.out.print("Please enter expression: ");for (;;) {

String expr = readUserInput ();if (expr == null || "exit".equalsIgnoreCase(expr)) {

break;}try {

double result = calculator.calculate(expr);System.out.println("Result: " + result );

} catch (CalculatorException e) {System.out.print("Bad expression , try again: ");

}}

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 11 / 25

Page 12: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Перехват нескольких исключений

try {// ...

} catch (FirstException e) {e.printStackTrace ();

} catch (SecondException e) {e.printStackTrace ();

}

// since Java 7 can be replaced with:try {

// ...} catch (FirstException | SecondException e) {

e.printStackTrace ();}

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 12 / 25

Page 13: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Обработка исключения

Игнорирование (пустой catch)

Запись в лог

Проброс дальше того же или нового исключения

Содержательная обработка (например, повтор операции)

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 13 / 25

Page 14: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Исключения и освобождение ресурсов

InputStream is = new FileInputStream("a.txt");try {

readFromInputStream(is);} finally {

is.close ();}

Блок finally будет выполнен в любом случаеВ нем обычно освобождают использованные ресурсы

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 14 / 25

Page 15: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

try с ресурсами

try (InputStream is =new FileInputStream("a.txt")) {

readFromInputSteam(is);}

Метод close() будет вызван автоматически, как в finally

Можно перечислить сразу несколько ресурсовРесурсы должны реализовать интерфейсjava.lang.AutoCloseable

Добавлен в Java 7

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 15 / 25

Page 16: Java, осень 2014: Обработка ошибок, исключения, отладка

Исключения

Гарантии безопасности

Гарантии отсутствия исключений

Сильные гарантии

Слабые гарантии

Гарантия отсутствия утечек

Никаких гарантий

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 16 / 25

Page 17: Java, осень 2014: Обработка ошибок, исключения, отладка

Java Logging API

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 17 / 25

Page 18: Java, осень 2014: Обработка ошибок, исключения, отладка

Java Logging API

Пакет java.util.logging

Центральная сущность — java.util.logging.Logger

Логгеры образуют иерархию

Logger logger = Logger.getLogger("ru.compscicenter.java2014.logging");

logger.info("I’m logging!");

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 18 / 25

Page 19: Java, осень 2014: Обработка ошибок, исключения, отладка

Java Logging API

Почему не System.out.println

Логгеры включаются/отключаются и настраиваются безперекомпиляции

Возможно логирование в консоль, в файл, по сети. . .

Возможны разные форматы лога: текст, XML, . . .

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 19 / 25

Page 20: Java, осень 2014: Обработка ошибок, исключения, отладка

Java Logging API

Уровни логирования:SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST

logger.setLevel(Level.INFO);

logger.fine("I’m still logging");

logger.log(Level.WARNING ,"Houston , we have a problem!");

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 20 / 25

Page 21: Java, осень 2014: Обработка ошибок, исключения, отладка

Java Logging API

java.util.logging.Handler

Обработчик сообщенияОпределяет, куда будет записано сообщение

java.util.logging.ConsoleHandler

java.util.logging.FileHandler

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 21 / 25

Page 22: Java, осень 2014: Обработка ошибок, исключения, отладка

Java Logging API

java.util.logging.Formatter

Оформитель сообщенияОпределяет формат вывода

java.util.logging.SimpleFormatter

java.util.logging.XMLFormatter

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 22 / 25

Page 23: Java, осень 2014: Обработка ошибок, исключения, отладка

Отладка и диагностика

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 23 / 25

Page 24: Java, осень 2014: Обработка ошибок, исключения, отладка

Отладка и диагностика

Демо

Отладка приложения, запущенного в IDE

Отладка приложения, запущенного отдельно

Visual VM

Mission Control

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 24 / 25

Page 25: Java, осень 2014: Обработка ошибок, исключения, отладка

Что сегодня узнали

Какие есть подходы к обработке ошибок

Как пользоваться исключениями

Как пользоваться стандартным API для логирования

Какие инструменты могут помочь в диагностике проблем

Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 25 / 25