2016-03-16 155 views
3

爲什麼此java代碼會拋出StackOverflowError異常?StackOverFlowError with BigInteger in java

public class factorial2 { 

    public BigInteger fact(BigInteger n) 
    { 
     BigInteger one = new BigInteger("1"); 
     if(n.equals("0")) 
       return one; 
     else 
      return n.multiply(fact(n.subtract(one)));  
    } 

    public static void main(String[] args) {  
     @SuppressWarnings("resource") 
     Scanner sc = new Scanner(System.in); 
     int n = sc.nextInt(); 
     factorial2 f = new factorial2(); 
     for(int i=0;i<n;i++) 
     { 
      BigInteger b = sc.nextBigInteger(); 
      System.out.println(f.fact(b)); 
     } 
     sc.close(); 
    } 
} 

我試圖使用生成一個BigInteger階乘。但是,爲什麼我的代碼在輸入時會提供參考異常?

+4

一個BigInteger永遠不會平等使用三元操作(有條件的經營者? :)喜歡寫東西

public static BigInteger fact(BigInteger n) { if (n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)) return BigInteger.ONE; else return n.multiply(fact(n.subtract(BigInteger.ONE))); } 

' 「0」'。嘗試與'BigInteger.ZERO'比較。 –

+3

另外,不需要製作自己的BigInteger 1 - 使用'BigInteger.ONE'。 –

+0

非常感謝。問題解決了。 :) – shuvro

回答

4

的問題是與你的基本情況; n(這是一個BigInteger)將不等於"0"(這是一個String)。所以你繼續到else區塊,重新詛咒。此外,BigInteger包括ONEZERO常數,所以你可以像

public static BigInteger fact(BigInteger n) { 
    return (n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)) ? BigInteger.ONE 
      : n.multiply(fact(n.subtract(BigInteger.ONE))); 
} 
2

的BigInteger#equals方法

public boolean equals(Object x) { 
    // This test is just an optimization, which may or may not help 
    if (x == this) 
     return true; 
    if (!(x instanceof BigInteger)) 
     return false; 

這種情況始終爲false

if (n.equals("0")) 

相反,使用

if (BigInteger.ZERO.equals(n))