Как я могу узнать, какие исключения могут быть выброшены из метода? - PullRequest
3 голосов
/ 09 января 2010

Как узнать, какие исключения могут быть вызваны вызовом метода?

Ответы [ 6 ]

6 голосов
/ 09 января 2010

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

Не существует 100% надежного способа узнать, какие типы RuntimeException или Error могут быть выброшены. Идея состоит в том, что эти типы вряд ли будут восстановимы. Обычно высокоуровневый обработчик исключений выступает в качестве «универсального» средства для регистрации, отображения или иного отчета о RuntimeException. В зависимости от типа приложения оно может завершиться в этот момент или продолжить работу.

Некоторые API-интерфейсы документируют исключения во время выполнения, которые они могут выдавать с тегами JavaDoc, как проверенное исключение. Однако компилятор не применяет это.

В общем, Error не пойман. Это указывает на то, что во время выполнения что-то серьезно не так, например, недостаточно памяти.

2 голосов
/ 09 января 2010

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

Не проверено исключения - RuntimeException и подклассы - не объявляются и могут быть вызваны любым методом.

Тем не менее, если ваш метод обычно генерирует непроверенное исключение, было бы неплохо задокументировать этот факт в javadoc.

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

2 голосов
/ 09 января 2010

Посмотрите на объявление метода (или Javadoc). В нем будут перечислены все отмеченные исключения , которые могут быть сгенерированы этим методом.

Любой метод может выдать любое непроверенное исключение .

Проверяемые исключения - это любые исключения, полученные из java.lang.Exception (включая сам Exception), за исключением java.lang.RuntimeException и его подклассов. Непроверенные исключения - это типы, производные от Throwable (включая Throwable), которые не происходят от Exception, за исключением RuntimeException и его подклассов. Нет, это не очень хорошо продумано ...

2 голосов
/ 09 января 2010

Вы прочитали предложение throws.

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

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

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

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

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

Единственный способ получить более точный ответ - использовать некоторый (гипотетический) исходный код или анализатор байт-кода. Например, вы можете определить, что определенные исключения никогда не генерируются или распространяются методом, просто проверяя, что в полной кодовой базе нет экземпляров new SomeException(...). Но для некоторых исключений (например, NullPointerException и OutOfMemoryException) этот анализ будет трудноосуществимым, за исключением очень ограниченных случаев.

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

Для проверенного исключения «throws» при вызове метода расскажет вам всю историю.

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

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

Итак: если вы действительно, действительно хотите знать, что можете, но это может потребовать немного работы.

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