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

mrb*_*lah 12 java exception

来自C#,我只是没有得到在类/方法定义之后写的'抛出异常':

public void Test() throws Exception
Run Code Online (Sandbox Code Playgroud)

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

del*_*ego 25

你不具备把它写在所有情况下-你只是如果你的方法抛出一个检查写它Exception(一个例外是的子类Exception,而不是一个子类RuntimeException).这是因为你的方法签名是一个契约,并且它向所有调用它的代码声明它有可能抛出给定的异常.因为它是一个经过检查的异常 - 可以预见的异常 - 调用代码需要预测看到抛出异常的可能性,并且需要能够处理它.

回答你的两个具体问题:

  • 你必须写它/如果不这样做:如果你的方法抛出一个已检查的异常,那么是的,你必须在你的方法签名中声明它.如果不这样做,那么您的代码将无法编译.
  • 你必须抓住它:你必须做些什么.调用该方法的代码可以捕获它并处理它,它可以捕获它并重新抛出它,或者它可以将它传递给链.为了将它传递给链,调用方法的代码必须自己声明它抛出相同的异常 - 例如,如果方法bar可以抛出SomeException,并且方法foo调用bar并且不想捕获异常,则方法签名为foo会宣称它太投掷了SomeException.

Java课程例外章节非常擅长详细解释这一点,JavaWorld有一篇关于抛出和捕获异常的好文章,我总是发现它是传递给人们的好参考.


Yis*_*hai 7

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

如果抛出异常的方法中有任何东西它将无法编译,除非您捕获异常或在方法上声明它,然后调用该方法的任何东西都必须以相同的方式处理异常.