Java 我抛出的异常运行到StackOverflowerr中

Java 我抛出的异常运行到StackOverflowerr中,java,exception,stack-overflow,Java,Exception,Stack Overflow,我有以下简单的递归斐波那契代码: 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 Fib

我有以下简单的递归斐波那契代码:

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));
}

}
公共类FibPrac5202016
{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
System.out.println(“输入索引号:”);
int integer=input.nextInt();
FIBPRAC52016对象=新的FIBPRAC52020016();
System.out.println(object.operation(整数));
}
公共静态长操作(长n){
如果(n==0)
返回0;
如果(n==1)
返回1;
试一试{
if(n<0)
抛出新异常(“需要正数”);
}
捕获(异常exc)
{
System.out.println(“错误:+exc.getMessage());
}
返回操作((n-1))+操作((n-2));
}
}

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

是的,因为在捕捉到一个
异常后,您递归。您可以通过在
catch
中返回
-1
来修复它

catch(Exception exc)
{
    System.out.println("Error: " + exc.getMessage());
    return -1;
}
首先不抛出
异常
,如

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));
}

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

线程“main”java.lang.StackOverflowerr中出现异常

我认为解决办法是当你发现一个小于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));
}

}
公共类FibPrac5202016{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
System.out.println(“输入索引号:”);
int integer=input.nextInt();
FIBPRAC52016对象=新的FIBPRAC52020016();
System.out.println(object.operation(整数));
}
公共静态长操作(长n){
如果(n==0)
返回0;
如果(n==1)
返回1;
尝试
{
if(n<0)
抛出新异常(“需要正数”);
}
捕获(异常exc)
{
System.out.println(“错误:+exc.getMessage());
//返回-1;
}
返回操作((n-1))+操作((n-2));
}
}
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));
}

}