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块中处理它。但在这里如何以及谁在处理?
答案 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)
当一个方法声明抛出一个已检查的异常时,该方法的调用者应该处理它们。在运行时异常的情况下,调用者可以处理异常,但不需要这样做。