Почему в сигнатуре метода должны быть объявлены только определенные исключения - PullRequest
2 голосов
/ 21 сентября 2010

при объявлении методов с "IllegalAccessException" затмение вынуждает меня объявить метод как выбрасывающий исключение

public void a()  throws IllegalAccessException {
 if(x == 1){
   throw new IllegalAccessException("TEST);
 }
}

и в методе b, который использует "IllegalStateException", мне не нужно объявлять метод как броситьисключение

public void b()  {
 if(x == 1){
   throw new IllegalStateException("TEST);
 }
}

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

спасибо

Ответы [ 4 ]

11 голосов
/ 21 сентября 2010

Поскольку IllegalAccessException не является RuntimeException (т.е. проверяется как исключение), а IllegalStateException является RuntimeException (т.е. не проверяется как исключение).

Прочтите это для получения дополнительной информации: разница между java.lang.RuntimeException и java.lang.Exception

И это объяснение на сайте Oracle (дух!): http://download.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

Первый тип исключения - это проверенное исключение. Это исключительные условия, которые хорошо ожидаемое приложение должно предвидеть и восстанавливать. Например, предположим, что приложение запрашивает у пользователя имя входного файла, а затем открывает файл, передавая имя конструктору для java.io.FileReader. Обычно пользователь предоставляет имя существующего доступного для чтения файла, поэтому создание объекта FileReader завершается успешно, и выполнение приложения продолжается в обычном режиме. Но иногда пользователь указывает имя несуществующего файла, и конструктор создает исключение java.io.FileNotFoundException. Хорошо написанная программа поймает это исключение и уведомит пользователя об ошибке, возможно, запросив исправленное имя файла. Проверенные исключения подпадают под требование Catch или Specify . Все исключения являются проверенными исключениями, за исключением тех, которые указаны в Error, RuntimeException и их подклассах.

Вторым типом исключения является ошибка. Это исключительные условия, внешние по отношению к приложению, которые приложение обычно не может предвидеть или восстанавливать. Например, предположим, что приложение успешно открывает файл для ввода, но не может прочитать файл из-за аппаратного или системного сбоя. При неудачном чтении возникнет ошибка java.io.IOError. Приложение может решить перехватить это исключение, чтобы уведомить пользователя о проблеме, но для программы также может иметь смысл напечатать трассировку стека и выйти.

Ошибки не подпадают под требование Catch или Specify . Ошибки - это исключения, указанные в Error и ее подклассах.

Третий тип исключения - это исключение во время выполнения. Это исключительные условия, которые являются внутренними для приложения, и которые приложение обычно не может ожидать или восстанавливать. Они обычно указывают на программные ошибки, такие как логические ошибки или неправильное использование API. Например, рассмотрим приложение, описанное ранее, которое передает имя файла конструктору для FileReader. Если логическая ошибка приводит к передаче нулевого значения в конструктор, конструктор генерирует исключение NullPointerException. Приложение может перехватить это исключение, но, вероятно, имеет больше смысла устранить ошибку, вызвавшую возникновение исключения.

Исключения во время выполнения не подпадают под требования Catch или Specify . Исключения времени выполнения - это те, которые указаны в RuntimeException и его подклассах.

1 голос
/ 21 сентября 2010

IllegalAccessException является проверенным исключением.Проверенные исключения должны быть объявлены или обработаны, поскольку они являются ожидаемыми результатами операции.

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

1 голос
/ 21 сентября 2010

Как вы можете видеть в Javadoc JDK, IllegalStateException - это RuntimeException, что не относится к IllegalAccessException.

И как сказано в этом Javadoc:

RuntimeException является суперклассом те исключения, которые могут быть выброшены во время нормальной работы Виртуальная машина Java.

Метод не требуется объявлять в его броски оговорка любые подклассы RuntimeException, которое может быть брошено во время выполнения метода, но не пойман.

Это объясняет разницу.

0 голосов
/ 21 сентября 2010

Это часть Java-дизайна, когда некоторые исключения требуют объявлений throw, а некоторые - нет.Те, которые не называются «исключениями времени выполнения» и происходят от «RuntimException».IllegalAccessException не является исключением времени выполнения, и IllegalStateException имеет значение.

Логика, лежащая в основе различия, заключается в том, что общие исключения предназначены для исключительных случаев, которые могут возникнуть в любое время, независимо от того, что делает программист, и всегда должны обрабатываться.программистом, если они хотят, чтобы их код был обновлен.Исключение IllegalAccessException или IO Excection может быть вызвано отказом оборудования или правами доступа, которые находятся вне контроля программистов.Программное обеспечение должно что-то делать, когда оно происходит, и наличие условия throws заставляет программиста задуматься о том, что делать.IllegalStateException является признаком какой-либо ошибки программиста, поэтому его необязательно обрабатывать.

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