Java 我如何知道可以从方法中抛出哪些异常?

Java 我如何知道可以从方法中抛出哪些异常?,java,exception,Java,Exception,我如何知道可能会从方法调用引发哪些异常?查看方法签名的throws子句,以查看可能引发哪些“已检查”异常。方法的调用方必须在自己的throws子句中传播此信息,或者处理异常 没有100%可靠的方法可以知道可以抛出什么RuntimeException或Error类型。其想法是,这些类型不太可能恢复。通常,高级异常处理程序充当“全面捕获”来记录、显示或以其他方式报告运行时异常。根据应用程序的类型,它可能会在该点退出,或者继续运行 有些API会记录它们可能与JavaDoc标记一起抛出的运行时异常,就像

我如何知道可能会从方法调用引发哪些异常?

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

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

有些API会记录它们可能与JavaDoc标记一起抛出的运行时异常,就像检查过的异常一样。但是,编译器不强制执行此操作


通常,不会捕获
错误。这些表示运行时出现严重错误,例如内存不足。

您阅读了“throws”子句

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


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

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

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


选中异常是从
java.lang.Exception
(包括
Exception
本身)派生的任何异常,但
java.lang.RuntimeException
及其子类除外。未经检查的异常是从
Throwable
(包括
Throwable
)派生的类型,除了
RuntimeException
及其子类之外,它不是从
Exception
派生的。不,这并不是经过深思熟虑的…

对于选中的异常,方法调用上的“抛出”将告诉您整个过程

未经检查的异常更难处理。本质上,您需要绘制一个由该方法调用的所有方法的树,并绘制一个所有未检查异常的列表,其中任何一个都可以调用

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

所以:如果你真的想知道,你可以,但这可能需要一些工作。

检查异常——那些不从RuntimeException扩展的异常——在方法签名上声明,并且必须在使用这些方法的其他方法的签名上捕获或声明。编译器进行这些检查,如果违反了这些原则,编译器将不会完成生成

未经检查的异常(RuntimeException和子类)不会声明,并且可以由任何方法引发

也就是说,如果您的方法通常抛出未经检查的异常,那么最好在javadoc中记录该事实


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

对于选中的异常,只需查看方法的签名即可。如果签名声明该方法
抛出一个异常,那么该方法(或子类中的方法重写)可能抛出该异常或该异常的子类

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


获得更明确答案的唯一方法是使用一些(假设的)源代码或字节码分析器。例如,您可以通过简单地检查完整的代码库中是否没有
newsomeexception(…)
的实例,来确定某些异常从未被方法抛出或传播。但是对于某些异常(例如NullPointerException和OutOfMemoryException),除了非常有限的情况外,这种分析将是难以解决的。

在javadoc中。左边写着例外。这是未检查的还是已检查的异常?在抛出后的类内容页中,这些是未检查的异常还是已检查的异常?您可以声明一个方法抛出异常,无论它是否已检查。我不知道你说的“在左边”是什么意思。如果你点击一个包,然后在它下面你可以找到内容。类、异常和错误。它们意味着什么样的异常,检查还是不检查?如果选中,我在哪里可以找到运行时异常?它们根据我上面提到的规则进行检查或取消检查-如果它们派生自
RuntimeException
,或者不是派生自
Exception
,它们是未检查的-否则它们是已检查的。所以javadoc左侧的异常表示运行时异常?不确定您所说的是哪一个,但javadoc只记录已检查的异常,抱歉。@Ajsie-javadoc中某个方法的异常是该方法签名声明它抛出的异常
@Carl-你确定吗?我很确定我可以在Sun java中找到记录的未检查异常的例子。我的意思是在javadoc的左下框。以上错误我们有例外。这些是未检查的还是已检查的(运行时)异常?子类在“runtimeexception and Subclass”中是什么意思?我在哪里有所有未检查异常的列表?@Ajsie:“and Subclass”表示“runtimeexception”和“runtimeexception”的子类。@Carl-未检查的异常比这更复杂。考虑Null PosiExtExchange和OutOfMeMyLogy.*NOD****