2012-12-16 82 views
0

我正在嘗試實施Tom Nichols的低通濾波器。 我的方法是這樣的,但我得到一個出界異常,即使我已經裝備了防止所有的時間:LinkedList越界異常

private float filterValue(LinkedList<Float> listOfItems) 
    { 
     final float ALPHA = 0.2f; 
     float filtered; 

     int marker = listOfItems.size(); 

     if (listOfItems.size()>2) 
      marker = listOfItems.size() - 1; 

     float current = listOfItems.pollLast(); 
     float previous = listOfItems.get(marker); <<-- line 282 

     filtered = (float) previous + ALPHA*(current - previous); 

     return filtered; 


    } 

錯誤日誌:

12-16 15:54:51.148: E/AndroidRuntime(2055): FATAL EXCEPTION: main 
12-16 15:54:51.148: E/AndroidRuntime(2055): java.lang.IndexOutOfBoundsException 
12-16 15:54:51.148: E/AndroidRuntime(2055):  at  java.util.LinkedList.get(LinkedList.java:519) 
12-16 15:54:51.148: E/AndroidRuntime(2055): at se.macke.velocitysensor.SensorActivity$MySensorEventListener.filterValue(SensorActivity.java:282) 
12-16 15:54:51.148: E/AndroidRuntime(2055): at se.macke.velocitysensor.SensorActivity$MySensorEventListener.getAccelerometer(SensorActivity.java:249) 
12-16 15:54:51.148: E/AndroidRuntime(2055):  at se.macke.velocitysensor.SensorActivity$MySensorEventListener.onSensorChanged(SensorActivity.java:231) 
12-16 15:54:51.148: E/AndroidRuntime(2055):  at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:204) 
12-16 15:54:51.148: E/AndroidRuntime(2055):  at android.os.Handler.dispatchMessage(Handler.java:99) 

建議請。

/M

回答

2

大小返回列表的實際大小,它不是零索引。 get方法從使用基於零的索引的列表中檢索項目。警戒條件並不能防止這個問題。

int marker = listOfItems.size(); //assume size = 3, 
if (listOfItems.size()<2) //condition is not met. 
    marker = listOfItems.size() - 1; 

float previous = listOfItems.get(marker); //attempts to access non-existent index of 3 

修復

private float filterValue(LinkedList<Float> listOfItems) 
{ 
    final float ALPHA = 0.2f; 
    float filtered; 

    int marker = listOfItems.size(); 

    if (listOfItems.size() > 0){ 

     marker = listOfItems.size() - 1; 

     float current = listOfItems.pollLast(); 
     float previous = listOfItems.get(marker); <<-- line 282 

     filtered = (float) previous + ALPHA*(current - previous); 
    } 
    return filtered; 
} 
+0

男人,我想我已經試過了,只有我有if(listOfItems.size()> = 2)。似乎以任何方式完成了這個訣竅,我得到的結果稍微不那麼奇怪。 ^^ Thx很棒! – hacke

+0

@hacke很高興我能幫上忙。 –

3
if (listOfItems.size()<2) 
    marker = listOfItems.size() - 1; 

如果listOfItems.size()爲零,則VAR 將是-1造成IndexOutOfBoundsException

你應該把下界> 0

if (listOfItems.size()>0 && listOfItems.size()<2) 
    marker = listOfItems.size() - 1;