我怎么知道方法可以抛出什么异常?

时间:2010-01-08 23:07:07

标签: java exception

如何知道方法调用可能引发的异常?

6 个答案:

答案 0 :(得分:6)

查看方法签名的throws子句,以查看可能抛出的“已检查”异常。方法的调用者必须在自己的throws子句中传播此信息,或处理异常。

没有100%可靠的方法可以了解可以抛出哪些RuntimeExceptionError类型。这个想法是这些类型不可能被恢复。通常有一个高级异常处理程序充当“全能”来记录,显示或以其他方式报告RuntimeException。根据应用程序的类型,它可能会在此时退出,或继续运行。

有些API确实记录了他们可能使用JavaDoc标记抛出的运行时异常,就像检查异常一样。但是,编译器不强制执行此操作。

通常,Error未被捕获。这些表明运行时存在严重错误,例如内存不足。

答案 1 :(得分:2)

您阅读了“throws”条款。

无法判断可能会抛出哪些未经检查的异常。

如果程序想知道这一点,请使用反射来反映“投掷”列表。

答案 2 :(得分:2)

查看方法声明(或Javadoc)。它将列出可以从该方法抛出的所有已检查异常

任何方法都可以抛出任何未经检查的异常

已检查的异常是从java.lang.Exception(包括Exception本身)派生的任何异常,除了java.lang.RuntimeException及其子类。未经检查的异常是从Throwable(包括Throwable)派生的类型,除了Exception及其子类之外,派生自RuntimeException。不,这没有特别考虑到......

答案 3 :(得分:2)

已检查的异常 - 从RuntimeException扩展的异常 - 在方法签名上声明,必须在使用这些方法的其他方法的签名上捕获或声明。如果违反了这些主体,编译器会进行这些检查并且不会完成构建。

未经检查的异常 - RuntimeException和子类 - 未声明,可能被任何方法抛出。

也就是说,如果你的方法通常抛出一个未经检查的异常,那么在javadoc中记录这个事实是个好主意。

如果您需要捕获可能在您的方法中抛出的任何内容,您始终可以捕获异常或Throwable。这种方法在通用库或API的边界很常见,允许它们将传出的异常包装在标准类型中,并包含特定于API的错误信息。

答案 4 :(得分:1)

对于已检查的异常,方法调用中的“throws”将告诉您整个故事。

未经检查的例外情况稍微困难一些。基本上,您需要绘制方法调用的所有方法的树,并绘制其中任何一个可能调用的所有未经检查的异常的列表。

这当然包括抛出但未在这些类中捕获的任何内容,它当然也包括Java标准库中的方法以及项目中的任何其他库。

所以:如果你真的,真的想知道你可以,但它可能涉及一些工作。

答案 5 :(得分:1)

对于已检查的异常,只需查看方法的签名即可。如果签名声明方法throws是异常,那么方法(或子类中的方法覆盖)可能抛出异常或异常的子类。

对于未经检查的异常,任何方法调用理论上都可以抛出任何未经检查的异常。 (您可以为方法签名的未经检查的异常添加throws,但就编译器而言,这是多余的。throws仅用作文档。)

获得更明确答案的唯一方法是使用一些(假设的)源代码或字节码分析器。例如,您可以通过简单地检查完整代码库中没有new SomeException(...)的实例来确定方法永远不会抛出或传播某些异常。但是对于一些例外(例如NullPointerException和OutOfMemoryException),除非在非常有限的情况下,否则这种分析将是难以处理的。

相关问题