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

Uro*_*nym 0 java

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

这是我的一个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从未被抛出,现在它说它从未被捕获,但抛出.

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

Ale*_*exR 5

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

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