java抛出子句的意义是什么?
我理解检查异常的意义:提醒开发人员您需要注意的错误。我也理解,如果无法从异常中恢复,则不处理这些异常的意义 但是为什么,如果您决定不处理已检查的错误,您必须包含throws
语句 如果运行此代码,则会出现运行时错误,如果注释掉throws
语句(并添加{
),则会出现编译时错误。如果仍然中断程序,那么将错误抛出main()
似乎没有意义
import java.io.IOException;
public class Blah {
public static void main(String[] args)
throws IOException {
throw new IOException();
}
}
# 1 楼答案
事实上,它比这更强大。关键是强制开发人员(您)在应用程序的某个点上对错误采取措施。您可以执行以下两种操作之一:
您可以在抛出异常的同一方法体中捕获并(希望)处理该异常
您可以将异常添加到方法的
throws
列表中。。。以便它传播到方法的调用方。这就把处理异常的最初责任放到了调用方代码上在这种(一般)背景下,
throws
的观点是明确的。如果该语言没有throws
声明,那么Java的检查异常设计将无法工作1就Java语言规范而言,这些规则同样适用于所有Java方法,包括
main
方法。所以你必须在你的main
上加上“无意义的”throws IOException
。但这真的毫无意义吗?我认为没有。考虑如下:如果允许异常从应用程序的入口点
main
传播出去,那么用户会看到一个丑陋的堆栈跟踪。就他/她而言,您的应用程序已“崩溃”如果发生
IOException
,Java编译器告诉您的main
方法将“崩溃”不是更好吗假设应用程序中有两个类,它们都有一个
main
方法。是否应该允许它们都传播检查过的异常而不声明它们如果应用程序的代码库包含对
main
方法的特定调用,那么情况又如何呢。像对待其他电话一样对待这样的电话不是更好吗。。。这取决于在throws
子句中声明已检查异常的main
方法如您所见,希望
main
方法遵循与其他方法相同的异常规则,这是有充分理由的1-要么您必须用抛出的方法捕获已检查异常,而库方法不能抛出已检查异常,要么您需要在加载时对每个应用程序进行全局分析,以查看是否捕获了已检查异常
# 2 楼答案
throws
子句表示允许方法抛出某些异常。它规定了方法与其调用方之间的契约,让调用方知道它可以抛出哪些已检查的异常,从而知道调用方应该准备处理哪些异常,但是被调用的方法不必每次都抛出它们,或者根本不必抛出它们# 3 楼答案
如果另一个程序使用该方法,它需要能够捕获并处理它
# 4 楼答案
通过将异常添加到methods throws子句来“回避”异常的意义在于,在创建其他人将要使用的代码时,它具有灵活性。。也许您的代码会得到异常,但您更希望方法的调用方处理异常,而不是自己处理异常,这样调用的开发人员就可以知道发生了什么,而不是只是重新抛出异常或返回空值