如何在递归方法中返回try-catch?

时间:2017-11-03 17:32:37

标签: java

我不知道为什么我不能在我的代码中返回一个值,它就是:

private int depth(Position<Integer> p) {
    try{
        if (ab.isRoot(p))
            return 0;
        else 
            return 1+depth(ab.parent(p));
    }catch(InvalidPositionException | BoundaryViolationException e) {System.out.println(e.getMessage());}

}

它没有检测到返回。我知道这是一个尝试捕获,它可以捕获一个例外,但我很困惑,因为在我阅读的书(数据结构和算法 - 古德里奇和塔马西亚第4版)他&#39;不在参数中发送一个int(在递归中可能有用来保存值)

编辑:解决了,谢谢大家!

3 个答案:

答案 0 :(得分:3)

它正在“检测”return

只是在所有程序控制路径上没有明确的return:您需要在catch块中返回一些内容。

我个人虽然将函数本身标记为能够抛出当前catch的异常,并处理调用站点的异常。然后你的功能减少到

private int depth(
    Position<Integer> p
) throws InvalidPositionException, BoundaryViolationException 
{
    return ab.isRoot(p) ? 0 : 1 + depth(ab.parent(p));
}

答案 1 :(得分:1)

您必须从catch块返回以及在异常的情况下,永远不会到达try块内的return语句。

答案 2 :(得分:1)

您的方法签名表示它返回一个整数并且永不失败(不会抛出任何异常)。

如果您的代码中引发了异常,那么您的实施不符合此合同,但在这种情况下您不会返回任何值。

您可以通过两种方式修复它。您可以在catch块中返回一个值,也可以删除try catch块并将捕获的异常添加到方法的签名中。哪种解决方案更好取决于您的代码究竟做了什么,以及您认为它将如何使用。

另外请记住捕获异常,如果你不小心这样做,只记录就是一种不好的做法。