当我们使用throws时,谁以及如何处理异常?

时间:2011-07-01 09:09:11

标签: java exception-handling

class Test{

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

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

String s=br.readLine();
 }

}

当我们写抛出时,那么谁在实际处理IOException?当我们使用try-catch时,我们可以在catch块中处理它。但在这里如何以及谁在处理?

5 个答案:

答案 0 :(得分:6)

如果你有一个带有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();
    }
});

答案 1 :(得分:3)

没有人在那里处理它,因为main是程序的入口点。

使用throws时,您将离开方法的调用者,负责处理异常。这里没有该方法的调用者,除了JVM本身,它将通过停止程序和打印堆栈跟踪来处理异常。

答案 2 :(得分:2)

我相信JVM会通过停止主线程并将异常堆栈跟踪打印到标准输出

来处理它

答案 3 :(得分:1)

Saying throws允许您在程序的该阶段跳过处理异常。最好的例子和使用方法是:

假设您正在创建一个整数计算器,它具有多个加,减,除等函数。如果您声明除法方法throws DivideByZeroException,您的主计算器程序将必须处理它。这样做,您的程序确切地知道发生了什么问题。如果它是在功能级别下完成的,那么您的主程序将永远不会知道。

这种方法在开发库时非常出色,因为您不能在库函数中包含S.o.p语句。在这种情况下,JVM本身可以处理此异常。

答案 4 :(得分:0)

当一个方法声明抛出一个已检查的异常时,该方法的调用者应该处理它们。在运行时异常的情况下,调用者可以处理异常,但不需要这样做。