异常已经发现错误

Moo*_*ors 2 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是处理程序代码:

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!");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Excp并且Excp2都扩展Exception并具有类似的代码(没有).现在我得到错误Exception has already been caught错误Excp2,无论我是否向throwE方法提供2或0 .

Kob*_*obi 9

您正在寻找:

try
{ }
catch(Excp excp)
{
   log(excp);
}
catch(Excp2 excp2)
{
   log(excp2);
}
finally
{ }
Run Code Online (Sandbox Code Playgroud)

捕获异常时,指定异常的类型及其引用的名称.
您的原始代码尝试捕获Exception,这是最不具体的异常,所以在此之后您无法捕获任何内容.

  • @MoonStruckHorrors - `log`只是为了演示它是如何使用的.我认为你遗漏了**继承**中的基本内容,而异常是开始学习这个极其重要的主题的一种不好的方式.简而言之,你确实抛出了一个`Exception`,但是它有点*更真实*你正在抛出一个`Excp2`--这对Java有所不同. (2认同)
  • 我接受了你的话,试图从头开始理解它.你是对的,我忽略了继承的基本知识.我以不同的方式尝试了它.我没有使用`throw new Excp()`,而是使用了更长的方法.`Excp xyz = new Excp(); 扔xyz;`.我终于明白`Excp`就像一个普通的类,通过使用`new Excp()`,我们只是创建一个新的实例/对象.谢谢. (2认同)