如果我们可以使用try catch进行异常处理,为什么我们使用throws

时间:2015-09-25 02:01:48

标签: exception

异常处理背后的主要目的是管理在运行时或编译时的异常。

我们有两种处理异常的方法:

  1. 通过在try块中插入异常可疑代码并在catch块中捕获异常来抛出异常。
  2. 通过从方法写入throws来声明异常。
  3. 我的问题是为什么我们使用第二种方法,宣布例外?
    声明例外有什么用,但我们的目的是处理异常?
    已检查和未检查的异常有什么区别?

2 个答案:

答案 0 :(得分:2)

您将声明您的方法可以在您不想处理时抛出已检查的异常。例如,FileReader构造函数被声明为抛出FileNotFoundException。如果它不是,它将不得不自己处理它(例如通过打印"错误:找不到文件"关于标准错误),你将无法捕获它。

这与您的第二个问题有关:已检查和未检查的异常之间的区别是什么。 FileNotFoundException是一个经过检查的异常,这意味着您需要决定是否处理它,或者声明您没有处理它(这样您的方法调用者将面临同样的决定)。这确保了异常将在某处处理 - 如果不是,编译器会抱怨。不需要处理未经检查的异常,例如OutOfMemoryError - Java假定您不应该耗尽内存;因为理论上你可以在任何方法中耗尽内存,所以坚持你必须将每个方法都声明为OutOfMemoryError的潜在来源是荒谬的。

至于哪个:RuntimeExceptionError及其所有子类都未选中。 <{1}}及其子类(Exception除外)将被检查。

答案 1 :(得分:1)

Oracle对有问题与未经检查的例外here的争议有一个有用的记录。

他们的建议是:

  

这是底线指引:如果可以合理地预期客户   从异常中恢复,使其成为检查异常。如果客户不能这样做   要从异常中恢复的任何内容,请将其作为未经检查的异常。

根据具体情况,在特定方法中处理异常可能没有意义,堆栈中的某些内容可能能够做出正确的操作。

考虑一个FileNotFoundException,有时候在一个方法中捕获异常并解决它(加载一个默认值)可能是有意义的,但也许更高层次的更多关于用户意图的信息将能够做出正确的决定(提醒他们)缺少文件)。