2017-02-06 15 views
0

今日初めて、OutOfMemoryエラーに会った。私はいくつかのデータから移動平均をArrayListに計算しようとしており、最初の.add()ステップでクラッシュしました。この方法は、ArrayList.add()がOutOfMemoryエラーを起こしていますか?

java.lang.OutOfMemoryError 
                   at java.util.ArrayList.add(ArrayList.java:154) 
                   at com.xu.investo.MethodDatabase.getNdaySMA(MethodDatabase.java:46) 

を次のようにスタックトレースがあるライン46は

SMAs.add(i,0L); 

を指し

public ArrayList<Long> getNdaySMA(List<HistoricalQuote> history, int range){ 
    long sum =0; 
    long SMA = 0; 
    ArrayList<Long> SMAs = new ArrayList<Long>(); 
    //realRange is made due to the differences in defining "range in calculation vs speech 
    //a 10 day range for day 9 is actually from prices of day0 to day9, inclusive 
    int realRange =range-1; 

    //First step, add in placeholder 0s for the days within the range that have no value 
    //so if 10 day range, we have 0-> 9 
    for (int i=0;i<i+realRange;i++){ 
     SMAs.add(i,0L); 
    } 

    //Next, actually calculate the SMAs for i.e. day 10 
    for (int i =0;i<history.size();i++){ 
     //should be k<10, 0......9 = 10 days 
     for(int k=i+realRange;k==i;k--){ 
      //Sum first from k=i+range-1 , go down to i. 
      //This should give us a value of RANGE 
      sum +=history.get(k).getClose().longValue(); 


     } 
     //after summing up, we add calculate SMA and add it to list of SMAs 
     SMA = sum/range; 
     //we add the corresponding SMA to index i+range, made up of values calculated from before it 
     //to excel 
     SMAs.add(i+realRange,SMA); 
     sum =0; 
    } 

    return SMAs; 
} 

の下に示されているロング番号の形式を使用しているため、このエラーの発生していますか?どんな提案も大歓迎です。

+0

それは、あなたのループが無限ループであることを追加することの問題ではありません。それを慎重にチェック条件を終了することは決してありません "i

+0

問題は解決しましたか? –

+0

ええ、私は解決策を見つけた、その2番目の答え。 –

答えて

0

を無限ループを作成している場合があり、無限ループのようになります。

for (int i=0;i<i+realRange;i++) 

iは常にゼロより大きいrealRangeためi+realRange少ないし、次のようになります。

0

私は問題を特定したと思います。

私はこのラインで

for (int i=0;i<i+realRange;i++){ 
    SMAs.add(i,0L); 
} 
関連する問題