我怎么知道方法可以抛出什么exception?
我如何知道方法调用可能引发的exception?
查看方法签名的throws
子句,以查看可以抛出的“已检查”exception。 方法的调用者必须在自己的throws
子句中传播此信息,或处理exception。
没有100%可靠的方法可以知道可以抛出什么样的RuntimeException
或Error
类型。 这个想法是这些类型不可能恢复。 通常有一个高级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,只需查看方法的签名即可。 如果签名声明该方法throws
exception,则该方法(或子类中的方法重写) 可能抛出exception或exception的子类。
对于未经检查的exception,任何方法调用理论上都可以抛出任何未经检查的exception。 (您可以为方法签名添加未经检查的exception的throws
,但就编译器而言,这是多余的。 throws
只能用作文档。)
获得更明确答案的唯一方法是使用一些(假设的)源代码或字节码分析器。 例如,您可以通过简单地检查完整代码库中是否没有new SomeException(...)
实例来确定某些exception永远不会被方法抛出或传播。 但是对于一些例外(例如NullPointerException和OutOfMemoryException),除非在非常有限的情况下,否则这种分析将是难以处理的。