Какова цель выражения throws в Java? - PullRequest
2 голосов
/ 02 июля 2011

Я только изучаю java, но кажется, что в конце большинство методов в начале стека вызовов будут просто иметь объявления throws Exception.Что хорошего в этом утверждении, которое я пропускаю, делает его полезным?

Еще один пример.После написания некоторого кода я решил немного реорганизовать один из моих классов, используя классы из других библиотек Java;в результате не только половина методов этого класса получила еще 5 исключений в своих объявлениях, но и около половины всего моего другого кода - пока я не решил, что лучше просто написать 'throws exception' и мне все равнооколо.Может быть, я просто неправильно использую исключения?

Важное редактирование

Мой вопрос был не о том, что делает это утверждение - это довольно очевидно из документации.Мне действительно было интересно, почему разработчики языка решили сделать это утверждение необходимым.

Ответы [ 7 ]

3 голосов
/ 02 июля 2011

Хотя другие ответы правильны, я думаю, что они не достигли цели так, как вы ее просили.

Оператор throws - это способ создания трассировки стека исключений. В Java нет особой магии - это не какая-то загадка системы, которая создает исключение, это просто оператор «Бросок», и поэтому последние несколько записей в любой трассировке стека, вероятно, будут выбрасываться.

Это не просто последний, потому что во многих случаях обработка исключений состоит из чего-то вроде этого:

try {
     do something that might cause an exception
catch(ExpectedException e) {
     throw new DifferetnException(e);
}

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

Из-за этого часто последние несколько уровней (и, возможно, некоторые промежуточные) вызваны оператором "Throw".

3 голосов
/ 02 июля 2011

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

Для условий сбоев, которые не должны возникать при нормальном ходе работы, существует два особых типа исключений: RuntimeException и Error. Подклассы этих исключений не должны быть явно объявлены в предложении throws или перехвачены вызывающей стороной.

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

1 голос
/ 03 июля 2011

После долгих чтений об исключениях и передовых практиках я понял, что допустил ошибку, используя класс Exception для обработки ошибок программирования - который я проверяю буквально в каждом методе - где, как и следовало использовать RuntimeException,не требуется проверка.После рефакторинга моего кода я получил операторы throws только в необходимых местах, и теперь он аккуратный и чистый.

1 голос
/ 02 июля 2011

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

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

0 голосов
/ 02 июля 2011

В Java есть Проверенные исключения и Исключения времени выполнения .

Проверенные исключения могут появляться только в тех методах, которые явно их объявляют. Исключения времени выполнения могут встречаться в любом месте кода и не должны быть объявлены.Предложение throws IOException объявляет, что в этом методе возможно возникнет IOException.

Runtime Exception - это те, которые расширяют класс RuntimeException.Все остальные Проверенные Исключения .

Исключения фактически вызываются Утверждениями как throw new IOException(...) внутри метода.

0 голосов
/ 02 июля 2011

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

Когда в объявление метода помещается ключевое слово throw, это указывает на то, что вызов этого метода может вызвать исключение. Например:

public void methodFoo (int val) throws IllegalArgumentException  {
    if (val <0) throw new IllegalArgumentExecption();
}

означает, что methodFoo может вызвать исключение типа IllegalArgumentException. Когда вы вызываете такой метод, вы обычно используете следующий оператор блока try / catch:

try{
   methodFoo(int param);

}catch (IllegalArgumentException e){
       //if any method call inside methodFoo will raise such exception the execution flow of the program will be interrupted and the execution restart from the first catch block that intercept that execption
}

Преимущество этого подхода в том, что с такой функцией вы не обязаны проверять возвращаемое значение метода, чтобы убедиться, что ваш вызов метода завершился успешно. на языке C вы обычно делаете что-то вроде:

int ret = methodFoo();

if (ret == null){
     //error
}
0 голосов
/ 02 июля 2011

Он информирует вас о возможных проблемах и заставляет либо разбираться с ними, либо прямо заявлять, что это не так.

...