2011-07-27 11 views
0

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

这是我将Throwable的一个定义(其余基本上是相同的):

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

我在得到由main称为一个try/catch里面的成员函数,声明引发此。我将其他Throwable类放入由try/catch语句中由main调用的函数调用的函数内。下面是它的一个小部分:

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

请格式化你的代码!否则阅读是一种痛苦。 – Wolfcow

+0

@Wolfcow:done @ OP什么是parseFormula的方法签名? – Jacob

+0

@Wolfcow:你能向我解释如何格式化我的代码吗? @cularis:'private static double parseFormula(String formula)' – Uronym

回答

4

您并未声明parseFormula()会引发异常。

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

+0

是的,这解决了问题。我将签名更改为'private static parseFormula(String formula)throws OperatorException,ParenthesisException' – Uronym

+0

编译器会在try/catch语句中的函数调用函数内部引发异常时发出抱怨。如果我有这样的嵌套函数,是否需要在顶层函数的签名和嵌套函数中包含嵌套函数中引发的内容? – Uronym

+0

任何可能抛出异常并且不处理它的函数都需要声明抛出异常。 –

5

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

你不应该这样做。如果希望异常被检查异常(该编译器强制您捕获它),则扩展Excption;如果不希望编译器强制执行,则执行RuntimeException;如果认为这是致命的,则为Error。与throws ParenthesisException, OperatorException这样,当你把它称为尝试它知道该方法可以抛出异常声明

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需求,否则你正在尝试做一些它认为不会引发任何异常,因此投诉说你永远不会在try块中抛出任何异常,因为这没有什么可以捕捉的。

编辑:我必须是一个缓慢的打字员,没有看到两个新的答案,但我是同意什么Ĵ伦德伯格说]