Почему вы должны написать исключение throws в определении класса? - PullRequest
12 голосов
/ 05 января 2010

Исходя из C #, Я просто не получаю это «исключение выброса», которое пишется после определения класса / метода:

public void Test() throws Exception

Ты должен написать это? Что делать, если вы этого не сделаете? Если я вызываю метод с этим символом, должен ли я его перехватить?

Ответы [ 9 ]

25 голосов
/ 05 января 2010

У вас нет для записи во всех случаях - вы просто должны написать это, если ваш метод выдает проверенный Exception (исключение, которое является подклассом Exception и не подкласс RuntimeException). Это потому, что подпись вашего метода является контрактом, и он объявляет весь код, который вызывает его, что он может вызвать данное исключение. Поскольку это проверенное исключение - исключение, которое можно ожидать, - вызывающему коду необходимо предвидеть потенциальную возможность возникновения исключения и быть способным его обработать.

Чтобы ответить на два ваших конкретных вопроса:

  • вам нужно написать это / что если вы этого не сделаете: если ваш метод выдает проверенное исключение, тогда да, вы должны объявить его в сигнатуре вашего метода. Если вы этого не сделаете, то ваш код не будет компилироваться.
  • ты должен поймать это: ты должен сделать что-то с этим. Код, вызывающий метод, может либо перехватить его и обработать, либо перехватить и перебросить, либо просто передать его по цепочке. Чтобы передать его по цепочке, код, вызывающий метод, должен сам объявить, что он выдает то же исключение, например, если метод bar может выдать SomeException, а метод foo вызывает bar и не Если вы не хотите перехватывать исключение, сигнатура метода для foo объявила бы, что она тоже выдает SomeException.

Глава Исключения на уроках Java очень хорошо объясняет это подробно, а JavaWorld предлагает хорошую статью о создании и отлове исключений , которые я всегда находил хорошая ссылка для передачи на людей.

7 голосов
/ 05 января 2010

В основном да, и если вы этого не сделаете, ваша программа не будет компилироваться. Это называется проверенным исключением (любое исключение является проверенным исключением, если оно не является или не расширяет RuntimeException или Error).

Если в методе есть что-то, генерирующее исключение, оно не скомпилируется, если вы не перехватите исключение или не объявите его в методе, и тогда все, что вызывает этот метод, будет обрабатывать исключение таким же образом. 1003 *

3 голосов
/ 05 января 2010

Чтобы ответить на ваш конкретный вопрос, вы почти никогда не хотите сказать throws Exception как таковой.

Предложение throws уведомляет пользователей этого метода о том, что есть исключительный случай, который им придется обработать.Например, у вас может быть IOException, который является результатом некоторого использования методов манипулирования файлами (например, невозможность открыть рассматриваемый файл).Если вы не обрабатывали это локально, вам нужно объявить, что ваш метод throws с этим исключением возвращается вызывающей стороне.

Современные IDE сообщат вам, что для проверенных исключений вам нужно либо обработать ихвы используете метод или выбросите их из метода вверх по дереву вызовов (через предложение throws).

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

Эта концепция исключений с проверкой и без проверки не существует в .net. Намерение оригинальных Java-гуру заключалось в том, что если вам нужно объявить проверенные исключения, которые вы выбрасываете, то вызывающий будет знать, что он / она должен их перехватить. например, если вы имеете дело с библиотекой IO, то заставляет перехватывать IOException.

try {
    file.delete();
} catch (IOException x) {
    // do something
}

К сожалению, проверенные исключения чрезмерно используются в Java (см. Spring философия ). Существует много критики о злоупотреблении проверенными исключениями и о том, как они загрязняют код. Библиотеки, которые чаще всего выдают проверенные исключения, заставляют пользователей писать такой код:

try {
    file.delete();
} catch (IOException e) {
   throw new RuntimeException(e);
}

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

Существуют разные взгляды на этот счет, но сегодня преобладает тенденция избегать проверенных исключений (см. Успешные проекты, такие как spring, hibernate, apache-commons и т. Д.).

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

РЕДАКТИРОВАТЬ: Я нашел похожий вопрос (и один из моих предыдущих ответов) здесь . Может быть, это поможет.

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

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

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

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

0 голосов
/ 11 февраля 2013

Ответьте больше на тему, а не на описание : Класс не может использовать ключевое слово «throws».Только методы и конструкторы могут.

При небольшом взломе вы можете использовать броски в блоке инициализации (но не статично)Вы можете установить броски на конструктор, а затем он скомпилируется.

public class Example{ // here you can not use throws
{
    BufferedReader in = new BufferedReader(new FileReader("asdf"));   
}   
public AbstractWithConstantsOnly() throws FileNotFoundException {   }

public static void main(String[] args) throws Exception {
    new Example();
}
}
0 голосов
/ 05 января 2010

Ключевое слово «throws» используется, если исключение может не обрабатываться в текущем методе и может быть передано вызывающей стороне этого метода.

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

Класс Exception является базовым классом для Runtime Exception.

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

В C ++ (я не могу C #, но это, вероятно, похоже) ключевое слово throw является ограничением для всех типов исключений, поэтому, если нет спецификации для выдачи исключений, вы можете предположить, что это может быть что угодно.

В Java можно предположить, что если ключевое слово throws не используется, тогда этот метод никого не выбрасывает. (Вы можете быть уверены, но не должно быть исключений во время выполнения). Так что если есть какая-то спецификация о броске, вы должны поймать ее или распространить до

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...