为什么这段代码会产生StackOverflowError

时间:2018-05-26 14:49:43

标签: java methods

如果每个变量的值都大于零,我正在编写一个计算公式(x + y)/ z的方法​​。如果它们小于零,则控制台应打印" 0"。

我的代码如下所示:

package arrayTest;

public class berechne {

    public static int berechneZahlen (int x, int y, int z) { //method
        int ergebnis=0; 
        if (berechneZahlen(x, y, z) > 0) {
             ergebnis = (x+y)/z; //ergebnis = result
        }
        else {
            System.out.println("0");
        }
        return ergebnis;
    }

    public static void main(String[] args) {

        System.out.print(berechneZahlen(2, 3, 6));

    }
}

现在,在编辑器中我没有收到任何错误。一切似乎都很好。但是当我编译它时,它会给我这个错误十几次:

Exception in thread "main" java.lang.StackOverflowError
    at arrayTest.berechne.berechneZahlen(berechne.java:7)
    at arrayTest.berechne.berechneZahlen(berechne.java:7)
    at arrayTest.berechne.berechneZahlen(berechne.java:7)

我无法弄清楚为什么代码无法正常工作。

4 个答案:

答案 0 :(得分:2)

您在没有终止点的情况下以递归方式调用函数,因此导致StackOverFlowError

if (berechneZahlen(x, y, z) > 0)

相反,请引入您的代码以检查x, y, x > 0是否符合您的要求:

  

如果每个变量的值都大于零。如果它们小于零,则控制台应打印" 0"。

if (x > 0 && y > 0 && z > 0) {
    //bla bla
} else {
    //print 0
}

答案 1 :(得分:1)

该方法以递归方式调用自身。试试这个:

public static int berechneZahlen (int x, int y, int z) { //method
  int ergebnis=0; 
  if (z>0 && (x+y) > 0) {
    ergebnis = (x+y)/z; //ergebnis = result
  }
  else {
    System.out.println("0");
  }
  return ergebnis;
}

答案 2 :(得分:0)

有一些问题,但也有一些可以改进的事情。

导致错误的原因是你没有检查x,y,z是否大于0但是你正在检查这些数字的berechneZahlen是否大于0,这导致它被递归调用。

此外,在其中一个为0的情况下,您在方法中打印“0”但是您还在主函数中打印berechneZahlen的结果,导致“0”被打印两次,因此你可能只想在这种情况下返回0并且不在函数本身中打印它。

最后,我还会移除您的ergebnis变量。这没错,但没有必要。你只需返回结果即可。

这将是您的最终结果

public static int berechneZahlen (int x, int y, int z) {
    if (x > 0 && y > 0 && z > 0) {
        return (x+y)/z;
    } else {
        return 0;
    }
}

但是使用像这样的三元操作甚至可以缩短它

public static int berechneZahlen (int x, int y, int z) {
    return (x > 0 && y > 0 && z > 0) ? (x+y)/z : 0;
}

答案 3 :(得分:0)

StackoverflowError recursive call 引起。这意味着方法berechneZahlen()正在调用自己。在那个电话中,它再次呼唤自己,在接下来的呼叫中,它再次呼唤自己,等等......

public static int berechneZahlen (int x, int y, int z) {
    ... 
    if (berechneZahlen(x, y, z) > 0) { // (fatal) recursive call here
         ...
    }

每次调用都会在计算机内存上分配空间,直到内存完全填满数据并且没有剩余空间。在这一刻,程序执行失败了,因为它需要分配更多的空间来工作,但它不能分配更多。

这是一个适合您的工作解决方案,其中已删除递归:

public class berechne {

    public static int berechneZahlen (int x, int y, int z) {
        if (x < 0 || y < 0 || z < 0) {
            return 0; // return 0, if one of the numbers is below zero
        }
        return (x+y)/z; // return normal calculated result
    }

    public static void main(String[] args) {
        System.out.print(berechneZahlen(2, 3, 6));
    }
}