使用递归方法时,try-catch陷入无限循环

问题描述

所以我对Java很陌生,我不知道这是怎么发生的,但是当我由于堆栈溢出而导致程序崩溃时,我的catch方法似乎捕获了它,但陷入了无限循环,不知道为什么或如何解决。有人可以帮我吗?我真的很感激。

private static int Fibonacci(int n)
{
    int fibVal = 0;
    try
    {
        if (n == 0)
        {
            fibVal = 0;
        }
        else if (n == 1)
        {
            fibVal = 1;
        }
        else
        {
            fibVal = Fibonacci(n - 1) + Fibonacci(n - 2);
        }
    }
    catch (StackOverflowError e)
    {
        System.out.println("This was another stack overflow,probably too high an input");
    }

解决方法

完全摆脱您的try / catch块。您不应该发现错误。

Differences between Exception and Error

斐波那契的递归解决方案效率很低。您将遇到StackOverflowError,其中包含非常小的数字,例如100。这仅仅是解决方案的局限性。您必须使用其他方法来实现它,您可以在网上找到它们。

,

尝试一下。同意George的意见,不要对Fibonacci使用递归。修改了一下代码。

public class Demo{

private static int Fibonacci(int n)
{
    if (n == 0)
    {
        return 0;
    }
    else if (n == 1)
    {
        return 1;
    }
    else
    {
        return (Fibonacci(n - 1) + Fibonacci(n - 2));
    }
}


     public static void main(String []args){
        int result = Fibonacci(8);
        System.out.println(result);
     }
}
,

好吧,当您捕获到异常时,您应该返回一个值,该值指示Fibonacci调用失败(示例-1)。然后,您应该更改代码以验证Fibonacci函数调用的结果以确保一切正常,然后添加它们。那应该照顾无限循环。否则,由于您正在捕获异常,因此递归调用将不断发生并引发异常。

也就是说,由于这似乎是一项家庭作业,因此只需完成任务即可,而不必担心捕获Stackoverflow异常。此外,您可以使用-Xssn标志来增加分配给VM的堆栈数量。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...