Обоснование исключений Java - PullRequest
4 голосов
/ 05 января 2012

На этот раз довольно теоретический вопрос.Поэтому я использую эту функцию в Eclipse:

CsvReader csv = new CsvReader("src/maindroite.csv");

, которая не может быть запущена из-за «Необработанного исключения типа FileNotFoundException».Хорошо, я понимаю, что мне нужно что-то добавить для случая, когда файл не существует, и в этот момент я обычно добавляю несколько строк, чтобы перехватить исключение и выбросить его.Но мой вопрос: зачем мне ловить исключение , даже если файл существует ?И вообще, почему у меня даже есть это исключение для некоторых функций, а не для других?

Например, допустим, я пытаюсь запустить:

ImageIcon icon1 = new ImageIcon("src/square.jpg");
ImageIcon icon2 = new ImageIcon("src/circle.jpg");

Где "square.jpg"существует, но не" circle.jpg ".Программа создаст icon1, но не icon2, потому что не может.Но мне не нужно добавлять ExceptionHandler для случая, когда изображение не существует.В чем разница между обеими функциями?

Подводя итог:

  • Почему я должен добавить ExceptionHandler, когда файл do существует?
  • Почему я должен добавить ExceptionHandler для некоторых функций, а не для других?

Спасибо!

Ответы [ 6 ]

4 голосов
/ 05 января 2012

Почему я должен добавить ExceptionHandler, когда файл существует?

По сути, вы должны добавить его независимо, потому что вы не можете написать условный код, подобный этому, вКороче говоря, нет никакого способа, которым компилятор мог бы знать до времени выполнения, существует ли файл или нет, поэтому компилятор заставляет вас поместить блок try / catch, поскольку FileNotFoundException является check исключением.1009 * Почему я должен добавить ExceptionHandler для некоторых функций, а не для других?

Вам нужно только добавить блоки try / catch ко всему, чтовыдает проверенное исключение, то есть все, что ** НЕ * наследует от RuntimeException или Error классов.Подклассы Error и RuntimeException не являются проверенными исключениями, и вы можете либо поставить try / catch, либо компилятору не все равно.Поскольку конструктор для ImageIcon не генерирует никаких исключений и просто возвращает ноль, если изображение не существует, нет необходимости делать блок try / catch. *

2 голосов
/ 05 января 2012

Даже если файл существует сейчас, в вашей системе он может не существовать позже.Или вы можете дать этот код кому-то, у кого нет src/square.jpg.Или, возможно, произойдет сбой оборудования, когда что-то на вашем жестком диске будет повреждено и случайно удалит src / square.jpg.Возможно, пользователь может даже просто удалить файлы.

Обработка исключений в Java заставляет вас задуматься о том, что произойдет в худшем случае, если произойдет что-то действительно плохое (например, src/square.jpg пропадет).Вы терпите крах?Можно ли продолжать, как будто ничего не случилось?Вы можете решить, как обрабатывать эти режимы сбоев, в предложении catch.

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

1 голос
/ 05 января 2012

Потому что в Java различаются так называемые «проверенные» и «непроверенные» исключения. Это источник многих горячих споров о том, должны ли вообще существовать непроверенные исключения или нет, и должны ли методы API генерировать исключения.

Согласно Java Trails:

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

Это так называемое обоснование.

Подробнее о "полемике" здесь .

1 голос
/ 05 января 2012

1) Почему я должен добавить ExceptionHandler, когда файл существует [es]?

Поскольку компилятор Java не может знать, существует ли этот файл в некоторых случаяхпроизвольное время выполнения.(Предположим, что файл был удален после компиляции, но до запуска программы?) По сути, ваш код всегда должен иметь логику, необходимую для обработки условий, которые не ожидаются, но могут произойти в любом случае.2) Почему я должен добавить ExceptionHandler для некоторых функций, а не для других?

Могут быть разные причины, но вот та, которую вы, вероятно, видите.Исключения создаются для каждого метода, но перехватываются для каждого блока try / catch или для каждого метода, если они распространяются вверх.В вашем примере вы можете заключить каждый вызов в конструктор ImageIcon в его собственный блок try / catch или оба вместе, в зависимости от того, что вы хотите сделать:

try {
  icon1 = new ImageIcon("f1.jpg");
} catch (Exception e) { /* Handle the case for missing "f1.jpg". */ }
try {
  icon2 = new ImageIcon("f2.jpg");
} catch (Exception e) { /* Handle the case for missing "f2.jpg". */ }

По сравнению с:

try {
  icon1 = new ImageIcon("f1.jpg");
  icon2 = new ImageIcon("f2.jpg");
} catch (Exception e) { /* Handle the case for missing "f1" or "f2". */ }
0 голосов
/ 06 января 2012

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

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

0 голосов
/ 05 января 2012

Почему я должен добавить ExceptionHandler, если файл существует?

Пока он существует, но нет никакой гарантии, что он будет там каждый раз.Может случиться по целому ряду причин.Если файла нет, то нет смысла использовать InputStream и связанную бизнес-логику, и он уверен, что ваш бизнес не будет успешным.

Почему я должен добавить ExceptionHandler для некоторых функций ине другие?

Некоторые классы, такие как Imageicon, не являются препятствиями для вашей бизнес-обработки.Если их там нет, это нормально, вы все равно можете продолжить свою основную бизнес-логику.

Я чувствую, что это главная причина, по которой некоторые исключения из мандатов классов, а некоторые нет.

...