Если метод или конструктор либо генерирует исключение, которое не является производным от RuntimeException
, либо вызывает любой метод, декларация которого указывает, что он должен это делать, то он должен либо поймать это исключение, либо объявить, что исключение может быть выбрано из него , Эта особенность языка почти хорошая вещь, но в ее нынешнем виде широко признана ошибкой. Тем не менее, он достаточно прочно установлен как часть языка Java, что он никуда не денется.
Концептуально хорошо провести различие между исключениями, которые могут иметь особое значение для непосредственного вызывающего метода, и те, которые не будут. К сожалению, тот факт, что исключение будет иметь особое значение для его непосредственного вызывающего абонента, не означает, что непосредственный вызывающий абонент будет заинтересован в нем. Способ, которым Java реализует проверенные исключения, если Foo
объявлен как бросающий проверенное исключение, а Bar
вызывает Foo
, но не готов обработать это исключение, он должен либо объявить себя как метать это исключение (хотя это вряд ли имеет какое-либо особое значение для его вызывающий объект), или же поймать исключение, на которое он не надеется обработать (возможно, ретронирование как тип, производный от RuntimeException
). Улавливание и ретронирование как типа, производного от RuntimeException
, семантически является наилучшим подходом, но в конечном итоге оно является самым многословным, особенно если вы хотите избежать создания объектов RuntimeException
.
Обратите внимание также, что, поскольку цепочка конструктора с цепочкой не может быть заключена в блок, любой конструктор, который соединен цепью через конструктор, объявленный как исключающий любые исключения, должен объявить себя как бросающий те же исключения.Все это реализовано по какой-то причине, но, к сожалению, затрудняет конструктор класса отличать исключения, которые были выбраны как часть процесса построения базового класса, и те, которые были брошены в конструкцию производного класса.
Взгляните на конструктор 'Scanner' ... –
Без предложения throws код не компилируется **. Компиляция и работа - это не одно и то же. Прочитайте руководство об исключениях: http://docs.oracle.com/javase/tutorial/essential/exceptions/ –