try / catch不适用于静态成员throwable类?

时间:2011-07-27 15:57:42

标签: java

正如标题所示,我在抛出静态成员类时遇到了一些问题。但我不确定这是不是问题,编译器给了我关于我应该做什么的混合信号!我的程序的类和函数都在一个文件中。

这是我的一个Throwables的定义(其他的基本相同):

private static class ParenthesisException extends Throwable
{
    public ParenthesisException(){}
    public String strErrMsg()
    {
        return "ERROR: Every '(' needs a matching ')'";
    }
}

我把它放在一个成员函数中,该函数在try / catch语句中由main调用。我将另一个Throwable类放在由main在try / catch语句中调用的函数调用的函数中。以下是它的一小部分:

try
{
    parseFormula(cin.nextLine());
}
catch(ParenthesisException e)
{
    System.out.println(e.strErrMsg());
}
catch(OperatorException e)
{
    System.out.println(e.strErrMsg());
}

parseFormula是抛出ParenthesisException的静态成员函数。

编译器说:

  

jcalc.ParenthesisException的无法访问的catch块。永远不会从try语句主体

抛出此异常

但我 在parseFormula中抛出它,

if(n_lpar != n_rpar)
    throw new ParenthesisException();

奇怪的是,当我删除try / catch时,它告诉我没有捕获异常。这让我感到困惑,因为之前,它说ParenthesisException从未被抛出,现在它说它永远不会被捕获,但抛出。

我想知道这是否与它们都是静态成员(类和函数)的方式有关,以及我如何解决这个问题。

3 个答案:

答案 0 :(得分:5)

你的错误是你的ParenthesisException直接扩展了Throwable。

你不应该这样做。如果您希望检查异常是异常(编译器强制您捕获它),则扩展Excption,如果您不希望编译器强制使用RuntimeException,或者如果您认为这是致命的,则为Error。

答案 1 :(得分:4)

您没有声明parseFormula()会引发异常。

当您声明parseFormula()时,您需要添加throws ParenthesisException

答案 2 :(得分:0)

try { 
    parseFormula(cin.nextLine()); //This doesn't actually throw anything
} catch(ParenthesisException e) { 
    System.out.println(e.strErrMsg()); 
} catch(OperatorException e) { 
    System.out.println(e.strErrMsg()); 
}
需要使用parseFormula声明

throws ParenthesisException, OperatorException,这样当你在try中调用它时,它知道该方法可以抛出异常,否则你试图做一些它认为不抛出的东西异常,因此抱怨说你永远不会在try块中抛出任何异常,因此没有什么可以捕获的。

编辑:[我必须是一个缓慢的人,没有看到两个新的答案,但是我同意J伦德伯格的说法]