我抛出的异常运行到StackOverflowError

时间:2016-05-21 03:44:55

标签: java exception stack-overflow

我有以下简单的递归Fibonacci代码:

public class FibPrac5202016
{
public static void main(String [] args)  {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter index number: ");
    int integer = input.nextInt();
  FibPrac5202016 object = new FibPrac5202016();

System.out.println(object.operation(integer));
}

public static long operation(long n) {
 if(n==0)
     return 0;
 if(n==1)
     return 1;
 try {
     if( n < 0)
     throw new Exception("Positive Number Required");

 }
 catch(Exception exc)
 {
     System.out.println("Error: " + exc.getMessage());

 }

 return operation((n-1))+operation((n-2));
}

}

正如我最近了解的异常一样,当用户输入负整数时,我试图在这里使用它。但是,我的程序运行到StackOverflowError。

2 个答案:

答案 0 :(得分:1)

是的,因为你在之后递归,你会抓住Exception。您可以通过在-1中返回catch来轻松修复它。

catch(Exception exc)
{
    System.out.println("Error: " + exc.getMessage());
    return -1;
}

首先没有抛出Exception,如

public static long operation(long n) {
   if (n < 0) { 
       return -1;
   } else if (n == 0) {
       return 0;
   } else if (n == 1 || n == 2) {
       return 1;
   }
   return operation((n-1))+operation((n-2));
}

您可以实施Negafibonaccis。而且,您可以将其扩展为支持BigInteger(并使用memoization进行优化),例如

private static Map<Long, BigInteger> memo = new HashMap<>();
static {
    memo.put(0L, BigInteger.ZERO);
    memo.put(1L, BigInteger.ONE);
    memo.put(2L, BigInteger.ONE);
}

public static BigInteger operation(long n) {
    if (memo.containsKey(n)) {
        return memo.get(n);
    }
    final long m = Math.abs(n);
    BigInteger ret = n < 0 //
            ? BigInteger.valueOf(m % 2 == 0 ? -1 : 1).multiply(operation(m))
            : operation((n - 2)).add(operation((n - 1)));
    memo.put(n, ret);
    return ret;
}

答案 1 :(得分:0)

问题是这些会在try块中抛出一个execcion,这会创建一个循环,在这个循环中测试代码并且总是将小于0的数字总是无限地抛出异常,直到给出异常

  

线程“main”中的异常java.lang.StackOverflowError

我认为解决方案是在找到小于0的数字时停止程序

如下

public class FibPrac5202016 {
public static void main(String [] args)  {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter index number: ");
    int integer = input.nextInt();
    FibPrac5202016 object = new FibPrac5202016();

        System.out.println(object.operation(integer));
 }

 public static long operation(long n) {
  if(n==0)
    return 0;
  if(n==1)
    return 1;
  try 
{
    if( n < 0)            
        throw new Exception("Positive Number Required");   
}
catch(Exception exc)
{
    System.out.println("Error: " + exc.getMessage());
    //return -1;
}

return operation((n-1))+operation((n-2));
}

}