为何这段Java代码会抛出StackOverflowError?
解决Java StackOverflowError问题:无限递归导致的栈溢出
你遇到的StackOverflowError根源非常明确——你的berechneZahlen方法里出现了无终止条件的无限递归调用,方法不断调用自身,最终耗尽了JVM的栈内存。
看你代码的第7行:
if (berechneZahlen(x, y, z) > 0) {
每次执行这个判断时,都会重新调用berechneZahlen(x,y,z),而新的方法调用里又会执行同一个判断,再次触发调用,就这样无限循环下去,直到JVM抛出栈溢出错误。
而你原本的需求是检查所有变量x、y、z是否都大于0,完全不需要调用方法自身来判断。我们来修正代码,精准贴合你的需求:
package arrayTest; public class berechne { public static int berechneZahlen(int x, int y, int z) { // 直接判断所有变量是否都大于0 if (x > 0 && y > 0 && z > 0) { return (x + y) / z; } else { System.out.println("0"); return 0; } } public static void main(String[] args) { System.out.print(berechneZahlen(2, 3, 6)); } }
关键修改说明:
- 把递归调用替换成直接检查
x > 0 && y > 0 && z > 0,这才符合你“所有变量大于0时计算”的核心需求 - 简化了逻辑:满足条件直接返回计算结果,否则输出"0"并返回0(因为方法声明返回int类型,必须保证所有分支都有合法返回值)
- 移除了冗余的
ergebnis变量,直接返回结果让代码更简洁直观
测试一下修正后的代码:
- 当传入
(2,3,6)时,三个数都大于0,计算(2+3)/6(int除法自动取整为0),控制台会输出0 - 当传入包含负数的参数(比如
(-1,2,3)),会先打印"0",然后main方法里再输出返回的0,最终控制台显示两行0
内容的提问来源于stack exchange,提问作者aatii
相关产品推荐
相关产品推荐

