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

我如何知道方法调用可能引发的exception?

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

没有100%可靠的方法可以知道可以抛出什么样的RuntimeExceptionError类型。 这个想法是这些类型不可能恢复。 通常有一个高级exception处理程序充当“全部捕获”来记录,显示或以其他方式报告RuntimeException 。 根据应用程序的类型,它可能会在该点退出,或继续运行。

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

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

你读了’throws’条款。

没有办法告诉可能会抛出哪些未经检查的exception。

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

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

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

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

如果你需要捕获可能在方法中抛出的任何东西,你总是可以捕获Exception或Throwable。 这种方法在通用库或API的边界很常见,允许它们以标准类型包装传出exception并包含特定于API的错误信息。

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

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

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

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

未经检查的exception有点困难。 基本上,您需要绘制方法调用的所有方法的树,并绘制其中任何一个可能调用的所有未经检查的exception的列表。

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

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

对于已检查的exception,只需查看方法的签名即可。 如果签名声明该方法throwsexception,则该方法(或子类中的方法重写) 可能抛出exception或exception的子类。

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

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