2013-11-11 24 views
0

Это мой код:Зачем мне нужно «исключение бросков»?

public static void main(String[] args) throws Exception { 
    Scanner s = new Scanner(new File("story.txt")); 
    someFunction(s); 
} 

story.txt находится в корне проекта, но без throws Exception код не работает. Почему?

+1

Взгляните на конструктор 'Scanner' ... –

+1

Без предложения throws код не компилируется **. Компиляция и работа - это не одно и то же. Прочитайте руководство об исключениях: http://docs.oracle.com/javase/tutorial/essential/exceptions/ –

ответ

6

Вам не нужен throws Exception, но это не повредит, если вы оставите его таким.

Что вам нужно, это throws FileNotFoundException, потому что созданный вами конструктор Scanner объявляет о своем исключении, и вы не поймаете никаких исключений.

+0

Когда я не пишу его, я получаю «FileNotFoundException», даже когда путь правильный ...:/ –

+0

Если вы пишете это или нет, это не может повлиять на результат выполнения. –

+0

Как отметил JB Nizet, вы, вероятно, путаете сообщения компилятора со временем выполнения. –

2

Вы должны выбросить FileNotFoundException, так как конструктор Scanner может выбросить один. Поскольку это проверенное исключение, вы должны либо пройти его дальше по стеку, либо обработать его каким-то образом.

0

Потому что Scanner s = new Scanner(new File("story.txt")); throws checked FileNotFoundException. Вы должны throws или catch проверено исключение для компиляции.

1

Я спросил своего профессора, и он объяснил, что Java заставляет вас обрабатывать исключения.
Вы должны быть готовы к ним, если функция может их бросить.
Вы можете использовать либо:
try {...
} catch { ...
}

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

Спасибо за помощь!

1

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

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

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

Смежные вопросы