Java 是否检查或运行时多次抛出异常?
我有一个异常链,其中Java 是否检查或运行时多次抛出异常?,java,exception,runtime,checked-exceptions,Java,Exception,Runtime,Checked Exceptions,我有一个异常链,其中method1向method2抛出异常,该异常链将异常抛出到main。出于某种原因,编译器强制我处理method2中的错误,如果我没有处理,则将其标记为错误,表明它是已检查的异常。但是当相同的异常被进一步抛出到main行时,编译器允许我忽略它,并且不显示任何错误 method1中的原始异常是一个被选中的ParseException。但是该方法在头中有一个泛型的抛出异常子句,相同的对象被抛出到method2,它有一个相同的抛出异常子句。此异常何时以及如何丢失被编译器检查/捕获的
method1
向method2
抛出异常,该异常链将异常抛出到main
。出于某种原因,编译器强制我处理method2
中的错误,如果我没有处理,则将其标记为错误,表明它是已检查的异常。但是当相同的异常
被进一步抛出到main
行时,编译器允许我忽略它,并且不显示任何错误
method1
中的原始异常是一个被选中的ParseException
。但是该方法在头中有一个泛型的抛出异常
子句,相同的对象被抛出到method2,它有一个相同的抛出异常
子句。此异常何时以及如何丢失被编译器检查/捕获的状态
编辑以澄清:
public void method1() throws Exception{
// code that may generate ParseException
}
public void method2() throws Exception{
method1(); //compiler error (if the throws clause is left out)
}
public static void main(String[] args){
method2(); //ignored by compiler, even though the exception isn't caught or thrown or handled at all
}
编辑:
对不起,各位,这个问题是基于一个错误。。。main方法实际上有一个我缺少的
抛出异常
子句。我已经删除了它,代码现在的行为与预期的一样。谢谢你的帮助 已检查异常不会停止成为已检查异常。将已检查异常转换为未检查异常的方法是将其包装在一种RuntimeException中并重新抛出它。是否检查异常完全取决于它是哪种类型的异常:如果它是RuntimeException
或它的子类,则不检查它;否则,它就是。(是的,RuntimeException
是Exception
的一个子类——Java库设计的失败之一,但不是最主要的。)
编译器检查的是方法签名。因此,抛出的实际异常与此无关(为此目的)。如果方法说抛出异常
,那么您必须在方法中捕获异常
,或者声明方法抛出异常
。方法应始终使用尽可能窄的抛出
子句-例如,不是抛出异常
,而是抛出语法异常
(我说“不相关(为此目的)”,因为,当然,编译器将要做的另一件事是检查您没有抛出throws
子句中未包含的已检查异常。)
编辑您在编辑中添加的代码将无法编译:1。它调用一个没有实例的实例方法,2main
需要声明它抛出Exception
此代码解决了其他问题,并且(正确地)证明main
需要抛出异常
子句:
public class CheckTest
{
public static final void main(String[] params)
{
new CheckTest().method2();
}
public void method1() throws Exception{
throw new java.text.ParseException("foo", 2);
}
public void method2() throws Exception{
this.method1();
}
}
结果:
CheckTest.java:27: unreported exception java.lang.Exception; must be caught or declared to be thrown
new CheckTest().method2();
^
1 error
在您的情况下,它将连接到调用堆栈的根。如果一个方法被声明抛出异常
(这些方法很少应该这样做),调用方法要么说它也抛出异常
,要么捕获它并处理它
编辑对于已编辑的OP中的示例,它不会编译。如果您不想处理它,您可以声明
main
以抛出Exception
。您的编译器是否可能没有在main()
中抱怨该问题,因为它在method2()
中遇到了该问题并停止检查语法?两者都应该是错误的。您在method2()
中修复了调用并获得了干净的编译吗?您能澄清一下吗?method1是否抛出被method2和main视为“异常”的“ParseException”?一些方法签名和try-catch-throw代码片段会有所帮助。ParseException是自定义类吗?如果是这样的话,你能把它也添加到你的示例代码中吗?你发布的代码并不像编写的那样编译,因为method1()和method2()都需要是静态的才能被main调用。一旦您将它们设置为静态,编译错误将成为主要错误,因为它不会处理或抛出选中的异常。@ColinD-true,这段代码并不准确,只是试图给出一般的想法。method1和method2实际上是对象方法,main实例化一个对象并取消它们object@JarleHansen-ParseException不是自定义类。您可以查看javadoc:。当对格式
调用parse
时,通常会抛出该命令。例如,请参见DateFormat.parse(String)
,那么为什么main没有处理就可以了,而method2需要处理它呢?哎呀!我刚刚意识到我的错误。实际上在main的头中有一个抛出异常子句。。。当我把它去掉的时候,我期待的编译器错误出现了。很抱歉,谢谢你的帮助!