Главная » Java » Исключения – ошибки в программах

0

Скажем, вы  забыли закрыть фигурные скобки в своем  Java-­?коде. Это  приведет к ошибке компиляции, которую можно легко исправить.  Но  существуют ещё ошибки времени исполнения (run-­?time  errors), когда совершенно неожиданно, программа перестаёт работать, как положено. Например, Java-­?класс считывает файл со счётом в игре. Что произойдёт, если  кто-­?то удалит этот файл? Остановится ли программа с длинным и страшным сообщением  об ошибке,  или  продолжит  работать,  выдав дружелюбное сообщение, типа:

Дорогой друг, по какой-то причине, мне не удалось

прочитать файл

scores.txt.

Пожалуйста,

проверь,

существует ли этот

файл?

Создавайте  программы,  готовые  к  необычным  ситуациям.  Во  многих языках   программирования обработка ошибок  зависит только от доброй  воли   программиста.   Но   Java   заставляет   добавлять   код обработки ошибок, иначе программа даже не скомпилируется.

Ошибки   времени   выполнения  в  Java  называются  исключениями (exceptions),   а  обработка  таких  ошибок  называется  обработкой исключений   (exception   handling). Код,  который  может  вызывать исключения, помещайте  в  так  называемый  блок  try/catch.  Это  как будто  сказать JVM следующее: Попробуй прочитать файл со счётом игры,  но если что-­?то  пойдёт не  так, перехвати ошибку  и запусти код, который с ней разберётся:

try{

fileScores.read();

} catch (IOException e){ System.out.println(

"Дорогой друг, мне не удалось прочитать файл

scores.txt");

}

Вы  научитесь работать с файлами в  главе  9,  а сейчас запомните новый термин  I/O  или ввод/вывод  (input/output).  Операции  чтения  и  записи (на  диск  или другое устройство) называются вводом/выводом, отсюда IOException   — это класс, который содержит информацию об ошибках ввода/вывода.

Метод генерирует  (throws)  исключение в случае ошибки. Для разных типов  ошибок генерируются разные исключения. Если в программе есть блок  catch  для  данного конкретного  типа  ошибки,  то  она перехватится и программа перейдет к выполнению кода в блоке catch. Программа   продолжит  работу,  и  будет  считать,  что  об  этом исключении позаботились.

В  коде, приведенном  выше, вывод текста произойдет только в случаеошибки  чтения файла.Чтение трассировки стека

Если случается непредусмотренное   исключение,   которое   не обрабатывается  программой,  на  экран  выводится  многострочное сообщение об  ошибке.  Такое  сообщение  называется  трассировкой стека (stack trace). Если ваша программа вызывала несколько методов перед  тем,  как  столкнулась  с  проблемой,  трассировка  стека  поможет отследить проблему и найти строчку кода, которая вызвала ошибку.Давайте  напишем  программу  TestStackTrace, которая специально делила  бы на ноль (номера строк не являются частью кода).1  class TestStackTrace{

2  TestStackTrace()

3  {

4  divideByZero();

5  }

6

7  int divideByZero()

8  {

9  return 25/0;

10 }

11

12 static void main(String[]args)

13 {

14 new TestStackTrace();

15 }

16 }

Вывод этой программы  показывает последовательность методов, вызванных  до  момента  возникновения  ошибки  времени выполнения. Начинайте читать этот вывод с последней строчки, продвигаясь вверх.Exception in thread "main" java.lang.ArithmeticException: / by zero

at TestStackTrace.divideByZero(TestStackTrace.java:9)

at TestStackTrace.<init>(TestStackTrace.java:4)

at TestStackTrace.main(TestStackTrace.java:14)Это означает, что выполнение программы  началось с метода main(), потом перешло  к  init()  —  конструктору,  затем  был  вызван  метод divideByZero(). Числа  14,  4  и  9  указывают,  в  каких  строчках программы эти  методы были  вызваны.  После  этого,  было  вызвано исключение ArithmeticException, потому что в строке 9 программа пыталась разделить на ноль. Генеалогическое дерево исключений

Исключения  в  Java  —  это  тоже  классы,  и  некоторые  из них представлены  вот в такой иерархии (стрелка вверх указывает на родителя):

Потомки класса Exception называются некритичными исключениями (checked  exceptions), и вы  должны  обрабатывать их в своём коде. Т.е. программа как-­?то будет продолжать работать после таких исключений, но полученные результаты будут не те, что нам всем бы хотелось.Потомки  класса  Error —  это  фатальные  ошибки  JVM,  с  обработкой которых  не может справиться выполняемая  программа.TooManyBikesException (слишком  много  велосипедов)—  этопример  исключения, которое может быть создано программистом.Как программисту узнать заранее, что некий Java-­?метод некоего классаможет вызвать исключение, и что необходимо использовать блок

try/catch? Не стоит беспокоиться! Если вы  вызываете метод, который   может привести к  исключению, компилятор Java выдаст предупреждение об ошибке, вроде такого:"ScoreReader.java":  unreported exception: java.io.IOException; must be caught or declared to be thrown at line 57

Дополнительную информацию  о том,  какие исключения могут быть вызваны  теми или иными методами, можно найти в документации по Java. В  оставшейся части  главы  вы научитесь  обращаться

Источник: Java  Programming for Kids, Parents and Grandparents by Yakov Fain

По теме:

  • Комментарии