java捕获堆栈溢出,获取msg显示和返回问题

时间:2014-04-23 03:31:49

标签: java recursion exception-handling stack-overflow

所以我使用这种递归方法通过递归加法计算两个数的乘积。我知道大数字溢出堆栈,我的目的是捕获堆栈溢出异常,以便程序不会崩溃。但是,我不明白为什么输出消息在同一行中显示多次,并且返回0永远不会从方法中传出。返回0并不重要,我被迫有一个返回语句。但是,我没有回到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;
    }
}

2 个答案:

答案 0 :(得分:3)

您必须在第一次调用该方法时捕获错误一次(并从递归方法中删除try/catch):

long result = 0L;
try {
    result = multiplicationRecursive(num1, num2);
} catch (StackOverflowError e) {
    System.out.println("Recursion failed");
    result = 0L;
}

你的方法的问题是肯定的,异常会被捕获,但是然后该方法正常退出并返回到递归调用它的位置,有效地返回一个伪造的值。

答案 1 :(得分:0)

发生的事情是,当你的递归方法调用获得异常时,它会进入catch块,因为它返回0,它返回调用者,值为0.你的调用者总是如下所示

return num1 + multiplicationRecursive(num1, num2 - 1);

所以num1+0将在内部发生并返回计算值直到异常。 由于异常发生,您的递归方法将停止,因此它将计算值打印为num1+0

请参阅以下代码以进行正确的递归处理

if (num2 == 0) {
    return 0;
} else {
    try{
     //System.out.println("before oper");

            if(multiplicationRecursive(num1, num2 - 1)==0){
                return 0;
            }

            else{
                return num1 + multiplicationRecursive(num1, num2 - 1); 
            }

}
     catch (StackOverflowError e) {
            System.out.println("Recursion failed");
            return 0l;
        }
    //return 0;
}