我有一个例外链 method1 抛出一个例外 method2 这使例外 main. 。由于某种原因,编译器迫使我处理错误 method2 如果我不这样做,则将其标记为错误,表明它是检查的异常。但是当一样 Exception 被扔下了直线 main, ,编译器允许我忽略它,并且不显示任何错误。

原始例外 method1 是一个 ParseException, ,已检查。但是该方法具有通用 throws Exception 标题中的子句,同一对象被抛向Method2,它具有相同的 throws Exception 条款。该例外何时以及如何失去被编译器检查 /捕获的状态?

编辑以澄清:

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
}

编辑:对不起,大家,这个问题是基于错误...主要方法实际上有一个 throws Exception 我缺少的条款。我已经删除了这一点,并且代码现在的行为如预期的。感谢您的帮助!

有帮助吗?

解决方案

是否检查过例外完全取决于哪种例外是:如果是 RuntimeException 或一个子类,未检查;否则,是。 (是的, RuntimeExceptionException- Java库设计的失败之一,但不是最重要的。)

编译器检查是方法签名。因此,实际的例外是无关紧要的(为此目的)。如果方法说 throws Exception 那你必须抓住 Exception 在您的方法中或声明该方法 throws Exception. 。方法应始终使用 最狭窄 throws 条款 - 例如, 不是 throws Exceptionthrows ParseException.

(我说“无关(出于这个目的)”,因为当然是 其他 编译器将要做的事情是检查您没有丢弃检查的例外 throws 条款。)

编辑 您在编辑中添加的代码不会编译:1。它在没有实例的情况下调用实例方法和2。 main 需要声明它投掷 Exception.

该代码解决了其他问题,并且(正确)证明了 main 需要 throws Exception 条款:

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

其他提示

检查的例外不停止被检查的异常。您可以将检查的异常变成未选中的方式是将其包裹在一种运行时exception中并重新插入它。

就您而 Exception一直向下 呼叫堆栈的根。如果宣布抛出方法 Exception (哪种方法很少会这样),调用方法要么必须说它抛出 Exception 也要抓住它并处理它。

编辑 至于编辑OP中的示例,不会编译。您可以声明 main 投掷 Exception 但是,如果您不想处理它。

您的编译器是否可能没有抱怨 main() 因为它遇到了问题 method2() 并停止在这一点上检查语法吗?两者都应该是一个错误。您是否修复了电话 method2() 并获得了干净的编译?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top