2010-07-11 63 views
1

下面的代码:异常已经陷入错误

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方法。

回答

6

您正在寻找:

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

当你捕获异常,指定型异常,而名其参考的
您的原始代码试图捕获Exception,这是最不具体的例外,因此您在此之后无法捕获任何内容。

+0

但是Excp2的类型是Exception(因为它扩展了Exception类)。您提供的修复工作正常,但我不明白使用'Excp2 excp2',这不是说类型是Excp2吗? 另外,log(excp2)'有什么用? – MoonStruckHorrors 2010-07-11 11:47:53

+2

@MoonStruckHorrors - 'log'只是为了演示它如何使用。我认为你在**继承**中缺少一些基本的东西,而例外是开始学习这个非常重要的主题的一种不好的方式。简而言之,确实是抛出了一个'Exception',但是你抛出一个'Excp2'有点真实* - 这对Java有所不同。 – Kobi 2010-07-11 11:52:36

+2

我接过你的话,并试图从头开始理解它。你是对的,我忽略了继承的基础知识。我以不同的方式尝试过。我没有使用'throw new Excp()',而是使用了更长的方法。 'Excp xyz = new Excp();扔xyz;'。我终于明白'Excp'就像一个普通的类,并且使用'new Excp()',我们只是创建一个新的实例/对象。谢谢。 – MoonStruckHorrors 2010-07-11 12:04:52

0

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

请别人电话我,如果这是对Java :)真正

+0

不是。可以捕获多个异常。因此,这个线程的目的是有效的。 – MoonStruckHorrors 2010-07-11 11:48:39

+0

可以抛出异常,捕获,在方法之间运送,重新抛出并随时抓取。 OP的错误与多次捕获相同的异常无关,但是他对Exception类的异常与一般异常概念的混淆。他的代码最终为相同的异常类检查两次。 – 2010-07-11 11:49:48

1

的Java分派到catch()基于类型的异常从句:你的条款都试图赶上Exception类型的异常,并给他们的名字ExcpExcp2

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(); 
    } 
} 

呼叫它以truefalse作为参数。

2

当你捕捉到一个异常时,你必须指定你所捕捉的异常类型,这将允许你更好地处理发生的异常。有一点你必须牢记,但是有一些具体的和其他更多的“广泛目的”例外。

例如,NumberFormatExceptionException更具体,因为每当您尝试将字符串解析为数字时都会抛出NumberFormatException。

因此,当有多个catch语句时,总是将最具体的一个放在最上面,而最通用的放在最后。如果你在开始的时候使用的是更通用的,那么它会在异常传递给更具体的catch语句之前捕获异常。

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