所以我使用这种递归方法通过递归加法来计算两个数字的乘积。我知道大数字会溢出堆栈,我的目的是捕获堆栈溢出异常,这样程序就不会崩溃。但是,我不明白为什么输出消息在同一行中显示多次,并且 return 0 永远不会从方法中传递出去。返回 0 并不那么重要,我被迫有一个 return 语句。但我返回的不是 0,而是看似随机的大数字。
我希望它只显示一次消息并将我的值传回,或者更好的是终止方法并仅返回消息。有什么想法吗?
方法如下:
public static long multiplicationRecursive(long num1, long num2) {
try {
if (num2 == 0) {
return 0;
} else {
return num1 + multiplicationRecursive(num1, num2 - 1);
}
} catch (StackOverflowError e) {
System.out.println("Recursion failed");
return 0;
}
}
最佳答案
您只需在第一次调用该方法时捕获错误一次(并从递归方法中删除 try/catch
):
long result = 0L;
try {
result = multiplicationRecursive(num1, num2);
} catch (StackOverflowError e) {
System.out.println("Recursion failed");
result = 0L;
}
您的方法的问题在于,异常会被捕获,但随后该方法会正常退出并返回到递归调用它的位置,从而有效地返回一个虚假值。
关于java捕获堆栈溢出,获取消息显示和返回问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23234241/