为什么必须在类定义中写入抛出异常?

2022-09-04 05:37:54

来自C#,我只是没有得到这个在类/方法定义之后编写的“throws异常”:

public void Test() throws Exception

你必须写这个吗?如果你不这样做呢?如果我调用具有此符号的方法,是否必须捕获它?


答案 1

您不必在所有情况下都编写它 - 如果您的方法抛出一个 checked(一个异常是 的子类而不是 的子类),则只需编写它即可。这是因为您的方法签名是一个协定,并且它向所有调用它的代码声明它有可能引发给定的异常。因为它是一个已检查的异常 - 一个可以预期的异常 - 调用代码需要预测看到抛出异常的可能性,并且需要能够处理它。ExceptionExceptionRuntimeException

要回答您的两个具体问题:

  • 如果你不这样做,你必须写它/如果你的方法抛出一个检查的异常,那么是的,你必须在你的方法签名中声明它。如果不这样做,则代码将无法编译。
  • 你必须抓住它:你必须对它做点什么。调用该方法的代码可以捕获它并处理它,它可以捕获它并重新抛出它,或者它可以将其传递到链上。为了将其向上传递到链上,调用该方法的代码必须自己声明它抛出相同的异常 - 例如,如果方法可以抛出,并且方法调用并且不想捕获异常,则方法签名将声明它也抛出。barSomeExceptionfoobarfooSomeException

Java课程的异常章节非常善于详细解释这一点,JavaWorld有一篇关于抛出和捕获异常的好文章,我一直认为这是传递给人们的一个很好的参考。


答案 2

基本上是的,如果你不这样做,你的程序将无法编译。这称为已检验异常(任何异常都是已检验的异常,除非它是或扩展了 RuntimeException 或 Error)。

如果方法中存在引发异常的任何内容,除非您捕获异常或在方法上声明异常,否则它不会编译,然后调用该方法的任何内容都必须以相同的方式处理异常。