Кто и как обрабатывает исключение, когда мы используем броски? - PullRequest
1 голос
/ 01 июля 2011
class Test{

public static void main(String[] cv) throws IOException{

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

String s=br.readLine();
 }

}

Когда мы пишем throws, тогда кто на самом деле обрабатывает IOException здесь? Когда мы используем try-catch, мы можем обработать его в блоке catch. Но вот как и кто справляется?

Ответы [ 5 ]

6 голосов
/ 01 июля 2011

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

Когда у метода main есть предложение throws, JVM позаботитсяперехвата исключения, и по умолчанию он просто напечатает трассировку стека исключения.

Если вы хотите выполнить специальную обработку, когда main выдает исключение, вы можете установить обработчик необработанного исключения:

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.err.printf("Thread %s threw an uncaught exception!%n", t.getName());
        e.printStackTrace();
    }
});
3 голосов
/ 01 июля 2011

Никто не обрабатывает его там, потому что main является точкой входа в программу.

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

2 голосов
/ 01 июля 2011

Я полагаю, что JVM справится с этим, остановив основной поток и напечатав трассировку стека исключений на стандартный вывод

1 голос
/ 01 июля 2011

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

Предположим, вы создаете целочисленный калькулятор, который имеет несколько функций для сложения, вычитания, деления и т. Д. Если вы объявите метод деления throws DivideByZeroException, ваша основная программа калькулятора будетдолжен справиться с этим.Делая это таким образом, ваша программа точно знает, какая проблема возникла.Если бы это было сделано на функциональном уровне, ваша основная программа никогда бы не узнала.

Этот подход превосходен при разработке библиотек, поскольку вы не можете включать операторы Sop в функции библиотеки.В этом случае именно JVM обрабатывает это исключение.

0 голосов
/ 01 июля 2011

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

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