【问题标题】:java catching stack overflow, getting msg display and return issuesjava捕获堆栈溢出,获取消息显示和返回问题
【发布时间】:2014-06-07 16:37:17
【问题描述】:

所以我使用这种递归方法通过递归加法计算两个数字的乘积。我知道大数字溢出堆栈,我的目的是捕获堆栈溢出异常,这样程序就不会崩溃。但是,我不明白为什么输出消息在同一行中显示多次并且 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;
    }
}

【问题讨论】:

    标签: java recursion exception-handling stack-overflow


    【解决方案1】:

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

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

    您的方法的问题在于,异常被捕获,但随后该方法正常退出并返回到它被递归调用的点,有效地返回一个虚假值。

    【讨论】:

      【解决方案2】:

      发生的情况是,当您的递归方法调用发生异常时,它会进入 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-08
        • 2016-01-23
        • 2020-11-01
        • 2012-09-22
        • 2020-03-24
        相关资源
        最近更新 更多