以下是代码:
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!");
}
}
}
Excp
和Excp2
都扩展了Exception
并且具有相似的代码(没有)。现在,我在Exception has already been caught
处收到错误Excp2
错误,无论我是否提供2或0到throwE
方法。
答案 0 :(得分:9)
您正在寻找:
try
{ }
catch(Excp excp)
{
log(excp);
}
catch(Excp2 excp2)
{
log(excp2);
}
finally
{ }
当您发现异常时,指定类型的异常,以及其引用的名称。
您的原始代码尝试捕获Exception
,这是最不具体的异常,因此您无法捕获任何内容。
答案 1 :(得分:2)
当您捕获异常时,您必须指定要捕获的异常类型,这将允许您更好地处理已发生的异常。但是,您必须记住的一件事是,存在特定的和其他更“广泛目的”的例外。
例如,NumberFormatException
比Exception
更具体,因为只要您尝试将字符串解析为数字,就会抛出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适用,请有人给我打电话:)