正如标题所示,我在抛出静态成员类时遇到了一些问题。但我不确定这是不是问题,编译器给了我关于我应该做什么的混合信号!我的程序的类和函数都在一个文件中。
这是我的一个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
从未被抛出,现在它说它永远不会被捕获,但被抛出。
我想知道这是否与它们都是静态成员(类和函数)的方式有关,以及我如何解决这个问题。
答案 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块中抛出任何异常,因此没有什么可以捕获的。