SlideShare a Scribd company logo
1 of 25
Download to read offline
Обработка ошибок, исключения, отладка
Алексей Владыкин
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

More Related Content

Viewers also liked

Viewers also liked (7)

07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
11 - Java. Многопоточность в Java: средства стандартной библиотеки
11 - Java. Многопоточность в Java:  средства стандартной библиотеки11 - Java. Многопоточность в Java:  средства стандартной библиотеки
11 - Java. Многопоточность в Java: средства стандартной библиотеки
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 
03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты
 
DFD моделирование - диаграммы потоков данных
DFD моделирование - диаграммы потоков данныхDFD моделирование - диаграммы потоков данных
DFD моделирование - диаграммы потоков данных
 

More from Roman Brovko

Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

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) 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
  • 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 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
  • 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("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
  • 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