异常已经发现错误

时间:2010-07-11 11:26:16

标签: java exception-handling

以下是代码:

public class Exc {
int x = 2;
public void throwE(int p) throws Excp, Excp2 { 
    if(x==p) {
        throw new Excp();
    }
    else if(x==(p+2)) {
        throw new Excp2();
    }
  }
}

这是处理程序代码:

public class tdExc {
public static void main(String[] args) {
    Exc testObj = new Exc();
    try {
        testObj.throwE(0);
        System.out.println("This will never be printed, so sad...");
    } catch(Exception Excp) {
        System.out.println("Caught ya!");
    } catch(Exception Excp2) {
        System.out.println("Caught ya! Again!!!!");
    } finally {
        System.out.println("This will always be printed!");
    }
  }
}

ExcpExcp2都扩展了Exception并且具有相似的代码(没有)。现在,我在Exception has already been caught处收到错误Excp2错误,无论我是否提供2或0到throwE方法。

4 个答案:

答案 0 :(得分:9)

您正在寻找:

try
{ }
catch(Excp excp)
{
   log(excp);
}
catch(Excp2 excp2)
{
   log(excp2);
}
finally
{ }

当您发现异常时,指定类型的异常,以及其引用的名称
您的原始代码尝试捕获Exception,这是最不具体的异常,因此您无法捕获任何内容。

答案 1 :(得分:2)

当您捕获异常时,您必须指定要捕获的异常类型,这将允许您更好地处理已发生的异常。但是,您必须记住的一件事是,存在特定的和其他更“广泛目的”的例外。

例如,NumberFormatExceptionException更具体,因为只要您尝试将字符串解析为数字,就会抛出NumberFormatException。

因此,当有多个catch语句时,总是将最具体的一个放在最顶层,最后放一些更通用的语句。如果你在开头放置更通用的那些,它们将捕获异常,然后才能将它传递给更具体的catch语句。

在你的情况下,你试图捕获两次相同的异常,因为你有两个试图捕获相同异常的catch语句。

答案 2 :(得分:1)

Java根据异常类型调度catch()子句:您的子句都试图捕获类型Exception的异常,并为它们指定名称Excp和{{1 }}:

Excp2

这不应该是public class tdExc { public static void main(String[] args) { Exc testObj = new Exc(); try { testObj.throwE(0); System.out.println("This will never be printed, so sad..."); } catch(Exception Excp) { 吗?

Excp e

这不应该是 System.out.println("Caught ya!"); } catch(Exception Excp2) { 吗?

Excp2 e

而且,虽然它是无关的,但我认为如果您更喜欢这样写,您的早期代码会更容易思考:

        System.out.println("Caught ya! Again!!!!");
    } finally {
        System.out.println("This will always be printed!");
    }
  }
}

使用public void throwE(boolean p) throws Excp, Excp2 { if(p) { throw new Excp(); } else { throw new Excp2(); } } true作为参数进行调用。

答案 3 :(得分:0)

我相信异常只能用java捕获一次。第一个异常处理程序将处理错误。

如果java适用,请有人给我打电话:)