2016-05-21 8 views
1

Ich habe den folgenden einfachen rekursive Fibonacci-Code:Meine geworfene Ausnahme läuft in Stackoverflow

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

} 

Wie ich vor kurzem über Ausnahmen gelernt, ich versuche, das hier verwendet wird, wenn die Benutzereingaben negative integer.However, mein Programm läuft in StackOverflowError.

Antwort

1

Nun ja, weil Sie nach rekrutieren fangen Sie eine Exception. Sie könnten es einfach beheben, indem Sie -1 im catch zurückgeben.

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

oder keine Exception in erster Linie zu werfen wie

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

oder Sie die Negafibonaccis implementieren könnte. Und, können Sie es erweitern BigInteger zu unterstützen (und optimieren mit memoization) wie

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; 
} 
+0

folgt Oder kann ich auch tun 'System.exit (0);', nicht wahr? –

0

das Problem ist, dass diese eine execcion innerhalb eines Try-Block führt, und dies erzeugt einen Zyklus, in dem Sie den Code zu testen und so wird es immer werden, um eine kleinere Zahl als 0 immer die Ausnahme ausgelöst hat unendlich, bis die Ausnahme

gegeben

Exception in thread "main" java.lang.StackOverflowError

ich denke, die Lösung ist das Programm ein Stopp zu machen, wenn Sie eine Zahl kleiner als 0

finden als

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

} 
Verwandte Themen