我的代码在使用递归函数时会出现异常

时间:2017-07-10 07:44:21

标签: java exception exception-handling parameter-passing

我试图在不使用java循环的情况下从1到10打印数字。当n + 1传递给第6行的recursivefun方法调用时,它工作正常。但是当传递n ++时,代码会抛出错误:/

public class PrintWithoutUsingLoops {

    public static void recursivefun(int n) {
        if (n <= 10) {
            System.out.println(n);
            recursivefun(n++);//an exception is thrown at this line.
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        recursivefun(1);
    }

}

4 个答案:

答案 0 :(得分:5)

recursivefun(n++);

n的原始值传递给递归调用(因为您正在使用后递增运算符),使此递归无限(因为每个递归调用都获得n的相同值,永远不会达到11)并导致StackOverflowError

将其更改为

recursivefun(n+1);

recursivefun(++n);

答案 1 :(得分:1)

recursivefun(n++);

post-increment的来电。后增量是一种在读取后放大值的机制。在这种情况下,您总是传递1。

您可以使用pre-increment ++nStackOverflowError首先:递增,然后传递值。

你得到的异常是UPDATE MyTable SET columnName = REPLACE (columnName, '-', ':'); ,这意味着堆栈已满,JVM无法在堆栈上存储更多的调用,因此无法恢复。

答案 2 :(得分:1)

recursivefun(n++);

此行表示:调用recursivefun(n);然后递增n by 1,这样您就可以使用n=1调用您的函数并确保stackOverflow确定

所以你需要在所有函数之前增加n,你有一些选择:

recursivefun(n+1);
//-----------------------------
n++;
recursivefun(n);
//-----------------------------
recursivefun(++n); //pre-cincrement

答案 3 :(得分:0)

实际上,post和pre增量运算符都会增加变量的值。他们的行为会根据使用情况而变化。假设以下代码:

对于循环1:     for(i = 0; i&lt; 10; i ++)     ...

对于循环2:     for(i = 0; i&lt; 10; ++ i)     ...

在上述两个语句中,for循环迭代10次,与所使用的增量样式无关。但请考虑以下代码:

int x = 10;
int y = 20;
int z = x++ + ++y; // z = 10 + 21
System.out.println("x = " + x); // prints 11
System.out.println("y = " + y); // prints 21
System.out.println("z = " + z); // prints 31

因此,从您的代码中可以看出这一点     recursivefun(N ++);

无限地使用参数1调用recursivefun。要避免StackOverFlow错误,请使用++ n或n + 1。