我如何知道从方法调用中可能抛出哪些异常?
throws
子句以查看可能抛出的“已检查”异常。方法的调用者将不得不在自己的throws
子句中传播此信息,或处理异常。RuntimeException
或Error
类型。这些类型的想法是它们不太可能被恢复。通常,高级别异常处理程序充当“捕获所有”以记录、显示或报告RuntimeException
。根据应用程序的类型,它可能在那一点上退出或继续运行。Error
。这些指示运行时存在严重问题,例如内存不足。您看到了“throws”子句。
无法确定会抛出哪些未经检查异常。
如果您的程序想要知道这一点,请使用反射来反射“throws”列表。
已检查异常——那些不是从RuntimeException扩展的异常——在方法签名上声明,必须被捕获或在使用这些方法的其他方法的签名上声明。编译器进行这些检查,如果违反了这些原则,将无法完成构建。
未检查异常——RuntimeException及其子类——不需要声明,并且可以由任何方法抛出。
话虽如此,如果您的方法通常会引发未检查的异常,最好在Javadoc中记录该事实。
如果您需要捕获可能在您的方法中抛出的任何异常,可以始终捕获Exception或Throwable。这种方法在通用库或API的边界处很常见,允许它们将传出异常包装在标准类型中并包括特定于API的错误信息。
对于受检异常,请简单查看方法签名。如果方法声明了throws
异常,那么该方法(或子类中的方法覆盖)可能会抛出该异常或其子类。
对于未受检异常,在理论上任何未受检异常都可能被任何方法调用抛出。(您可以为方法签名添加未受检异常的throws
,但就编译器而言,这是多余的。这个throws
仅作为文档说明。)
获取更明确的答案的唯一方法是使用某些(假设存在的)源代码或字节码分析器。例如,您可以通过检查完整代码库中没有new SomeException(...)
的实例来确定某些异常从不被抛出或传播。但对于某些异常(例如NullPointerException和OutOfMemoryException),除非在非常有限的情况下,否则此分析将是棘手的。
throws
的异常。 - Stephen C