Подтвердить что ты не робот

Почему вам нужно писать исключение исключений в определении класса?

Исходя из С#, Я просто не получаю это "исключение исключений", которое записывается после определения класса/метода:

public void Test() throws Exception

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

Эта концепция проверенных и непроверенных исключений не существует в .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, спящий режим, apache-commons и т.д.).

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

EDIT: я нашел аналогичный вопрос (и один из моих предыдущих ответов) здесь. Возможно, это поможет.

Ответ 7

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

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

Ответ 8

Ключевое слово

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

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

Класс Exception - это базовый класс для Execution Execution.

Ответ 9

Отвечайте больше на эту тему, а не на описание. Класс не может использовать ключевое слово "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();
}
}