Обработка ошибок, исключения, отладка
Алексей Владыкин
29 сентября 2014
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 1 / 25
1 Подходы к обработке ошибок
2 Исключения
3 Java Logging API
4 Отладка и диагностика
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 2 / 25
Подходы к обработке ошибок
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 3 / 25
Подходы к обработке ошибок
Ошибки игнорируются
При ошибке программа аварийно завершается
При ошибке функция вместо результата возвращает специальное
значение
Функция возвращает признак ошибки отдельным выходным
параметром
Функция возвращает признак ошибки в глобальной переменной
При ошибке функция бросает исключение
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 4 / 25
Исключения
Что такое «исключение»
Исключение (exception) — событие, возникающее в процессе
работы программы и прерывающее её нормальное исполнение
Примеры:
java.lang.NullPointerException
java.lang.ClassCastException
java.lang.OutOfMemoryError
java.io.IOException
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 5 / 25
Исключения
Пример исключения
java.lang.NullPointerException
at 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
Исключения
java.lang.Throwable
Исключение в Java — полноценный объект
Все исключения в Java наследуются от класса Throwable
String getMessage()
StackTraceElement[] getStackTrace()
void printStackTrace()
Throwable getCause()
Throwable[] getSuppressed()
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 7 / 25
Исключения
Классификация исключений
Исключительные ситуации в JVM
java.lang.Error
Исключительные ситуации в пользовательском коде
Проверяемые (checked)
java.lang.Exception
Непроверяемые (unchecked)
java.lang.RuntimeException
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 8 / 25
Исключения
Выброс исключения
public class CalculatorImpl implements Calculator {
@Override
public 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
Исключения
Объявление нового типа исключения
public class CalculatorException extends RuntimeException {
public CalculatorException (String message) {
super(message );
}
public CalculatorException (String message , Throwable cause) {
super(message , cause );
}
}
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 10 / 25
Исключения
Перехват исключения: 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
Исключения
Перехват нескольких исключений
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
Исключения
Обработка исключения
Игнорирование (пустой catch)
Запись в лог
Проброс дальше того же или нового исключения
Содержательная обработка (например, повтор операции)
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 13 / 25
Исключения
Исключения и освобождение ресурсов
InputStream is = new FileInputStream("a.txt");
try {
readFromInputStream(is);
} finally {
is.close ();
}
Блок finally будет выполнен в любом случае
В нем обычно освобождают использованные ресурсы
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 14 / 25
Исключения
try с ресурсами
try (InputStream is =
new FileInputStream("a.txt")) {
readFromInputSteam(is);
}
Метод close() будет вызван автоматически, как в finally
Можно перечислить сразу несколько ресурсов
Ресурсы должны реализовать интерфейс
java.lang.AutoCloseable
Добавлен в Java 7
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 15 / 25
Исключения
Гарантии безопасности
Гарантии отсутствия исключений
Сильные гарантии
Слабые гарантии
Гарантия отсутствия утечек
Никаких гарантий
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 16 / 25
Java Logging API
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 17 / 25
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
Java Logging API
Почему не System.out.println
Логгеры включаются/отключаются и настраиваются без
перекомпиляции
Возможно логирование в консоль, в файл, по сети. . .
Возможны разные форматы лога: текст, XML, . . .
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 19 / 25
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
Java Logging API
java.util.logging.Handler
Обработчик сообщения
Определяет, куда будет записано сообщение
java.util.logging.ConsoleHandler
java.util.logging.FileHandler
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 21 / 25
Java Logging API
java.util.logging.Formatter
Оформитель сообщения
Определяет формат вывода
java.util.logging.SimpleFormatter
java.util.logging.XMLFormatter
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 22 / 25
Отладка и диагностика
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 23 / 25
Отладка и диагностика
Демо
Отладка приложения, запущенного в IDE
Отладка приложения, запущенного отдельно
Visual VM
Mission Control
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 24 / 25
Что сегодня узнали
Какие есть подходы к обработке ошибок
Как пользоваться исключениями
Как пользоваться стандартным API для логирования
Какие инструменты могут помочь в диагностике проблем
Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 25 / 25

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

  • 1.
    Обработка ошибок, исключения,отладка Алексей Владыкин 29 сентября 2014 Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 1 / 25
  • 2.
    1 Подходы кобработке ошибок 2 Исключения 3 Java Logging API 4 Отладка и диагностика Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 2 / 25
  • 3.
    Подходы к обработкеошибок Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 3 / 25
  • 4.
    Подходы к обработкеошибок Ошибки игнорируются При ошибке программа аварийно завершается При ошибке функция вместо результата возвращает специальное значение Функция возвращает признак ошибки отдельным выходным параметром Функция возвращает признак ошибки в глобальной переменной При ошибке функция бросает исключение Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 4 / 25
  • 5.
    Исключения Что такое «исключение» Исключение(exception) — событие, возникающее в процессе работы программы и прерывающее её нормальное исполнение Примеры: java.lang.NullPointerException java.lang.ClassCastException java.lang.OutOfMemoryError java.io.IOException Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 5 / 25
  • 6.
    Исключения Пример исключения java.lang.NullPointerException at ru.compscicenter.java2014.Test.baz(Test.java:19) atru.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
  • 7.
    Исключения java.lang.Throwable Исключение в Java— полноценный объект Все исключения в Java наследуются от класса Throwable String getMessage() StackTraceElement[] getStackTrace() void printStackTrace() Throwable getCause() Throwable[] getSuppressed() Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 7 / 25
  • 8.
    Исключения Классификация исключений Исключительные ситуациив JVM java.lang.Error Исключительные ситуации в пользовательском коде Проверяемые (checked) java.lang.Exception Непроверяемые (unchecked) java.lang.RuntimeException Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 8 / 25
  • 9.
    Исключения Выброс исключения public classCalculatorImpl implements Calculator { @Override public 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
  • 10.
    Исключения Объявление нового типаисключения public class CalculatorException extends RuntimeException { public CalculatorException (String message) { super(message ); } public CalculatorException (String message , Throwable cause) { super(message , cause ); } } Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 10 / 25
  • 11.
    Исключения Перехват исключения: try-catch System.out.print("Pleaseenter 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
  • 12.
    Исключения Перехват нескольких исключений 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
  • 13.
    Исключения Обработка исключения Игнорирование (пустойcatch) Запись в лог Проброс дальше того же или нового исключения Содержательная обработка (например, повтор операции) Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 13 / 25
  • 14.
    Исключения Исключения и освобождениересурсов InputStream is = new FileInputStream("a.txt"); try { readFromInputStream(is); } finally { is.close (); } Блок finally будет выполнен в любом случае В нем обычно освобождают использованные ресурсы Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 14 / 25
  • 15.
    Исключения try с ресурсами try(InputStream is = new FileInputStream("a.txt")) { readFromInputSteam(is); } Метод close() будет вызван автоматически, как в finally Можно перечислить сразу несколько ресурсов Ресурсы должны реализовать интерфейс java.lang.AutoCloseable Добавлен в Java 7 Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 15 / 25
  • 16.
    Исключения Гарантии безопасности Гарантии отсутствияисключений Сильные гарантии Слабые гарантии Гарантия отсутствия утечек Никаких гарантий Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 16 / 25
  • 17.
    Java Logging API АлексейВладыкин Ошибки, исключения, отладка 29 сентября 2014 17 / 25
  • 18.
    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
  • 19.
    Java Logging API Почемуне System.out.println Логгеры включаются/отключаются и настраиваются без перекомпиляции Возможно логирование в консоль, в файл, по сети. . . Возможны разные форматы лога: текст, XML, . . . Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 19 / 25
  • 20.
    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
  • 21.
    Java Logging API java.util.logging.Handler Обработчиксообщения Определяет, куда будет записано сообщение java.util.logging.ConsoleHandler java.util.logging.FileHandler Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 21 / 25
  • 22.
    Java Logging API java.util.logging.Formatter Оформительсообщения Определяет формат вывода java.util.logging.SimpleFormatter java.util.logging.XMLFormatter Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 22 / 25
  • 23.
    Отладка и диагностика АлексейВладыкин Ошибки, исключения, отладка 29 сентября 2014 23 / 25
  • 24.
    Отладка и диагностика Демо Отладкаприложения, запущенного в IDE Отладка приложения, запущенного отдельно Visual VM Mission Control Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 24 / 25
  • 25.
    Что сегодня узнали Какиеесть подходы к обработке ошибок Как пользоваться исключениями Как пользоваться стандартным API для логирования Какие инструменты могут помочь в диагностике проблем Алексей Владыкин Ошибки, исключения, отладка 29 сентября 2014 25 / 25