Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否检查或运行时多次抛出异常?_Java_Exception_Runtime_Checked Exceptions - Fatal编程技术网

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。它调用一个没有实例的实例方法,2
main
需要声明它抛出
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的头中有一个
抛出异常
子句。。。当我把它去掉的时候,我期待的编译器错误出现了。很抱歉,谢谢你的帮助!