正如标题所示,我在抛出静态成员类时遇到了一些问题.但我不确定这是不是问题,编译器给了我关于我应该做什么的混合信号!我的程序的类和函数都在一个文件中.
这是我的一个Throwables的定义(其他的基本相同):
private static class ParenthesisException extends Throwable
{
public ParenthesisException(){}
public String strErrMsg()
{
return "ERROR: Every '(' needs a matching ')'";
}
}
Run Code Online (Sandbox Code Playgroud)
我把它放在一个成员函数中,该函数main在try/catch语句中被调用.我把我的另一个Throwable类放在一个被maintry/catch语句调用的函数调用的函数中.以下是它的一小部分:
try
{
parseFormula(cin.nextLine());
}
catch(ParenthesisException e)
{
System.out.println(e.strErrMsg());
}
catch(OperatorException e)
{
System.out.println(e.strErrMsg());
}
Run Code Online (Sandbox Code Playgroud)
parseFormula是静态成员函数throw ParenthesisException.
编译器说:
jcalc.ParenthesisException的无法访问的catch块.永远不会从try语句主体抛出此异常
但我确实把它扔在了parseFormula中:
if(n_lpar != n_rpar)
throw new ParenthesisException();
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我删除try/catch时,它告诉我异常没有被捕获.这让我感到困惑,因为之前,它说它ParenthesisException从未被抛出,现在它说它从未被捕获,但被抛出.
我想知道这是否与它们都是静态成员(类和函数)的方式有关,以及我如何解决这个问题.
你的错误是你ParenthesisException直接扩展了Throwable.
你不应该这样做.如果您希望检查异常是异常(编译器强制您捕获它),则扩展Excption,如果您不希望编译器强制使用RuntimeException,或者如果您认为这是致命的,则为Error.