2013-07-29 14 views
0

當我調用這個函數時,我得到了一個ArrayIndexOutOfBoundsException,但並不總是如此。出10次嘗試,我得到了一個錯誤3次,其餘7次它工作得很好。Java中的BufferedReader偶然出錯

void readTrainingData(Model m) throws FileNotFoundException { 

    BufferedReader br = null; 

    try { 
     br = new BufferedReader(new FileReader("training_data.csv")); 
    } catch (IOException ex) { 
     throw new FileNotFoundException(); 
    } 

    String line = ""; 
    int i = 0; 
    int j; 
    try { 
     while((line = br.readLine()) != null) { 
      String[] coords = line.split(","); 
      if (coords[0] != null && coords[1] != null) { 
       m.x[i] = Float.parseFloat(coords[0]); 
       m.y[i] = Float.parseFloat(coords[1]); 
      } 
      else { 
       System.out.println("Check training_data.csv"); 
      } 

      j = 0; 
      i++; 
     }   
    } catch (IOException ex) { 
     System.out.println("Problem reading file"); 
     throw new RuntimeException(ex); 
    } 
} 

的錯誤如下:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
    at polygonprobability.Util.readTrainingData(Util.java:215) 

我不能調試它,因爲每當我想,我沒有得到這個錯誤。

我完全困惑。請幫忙。

編輯:我改變了有條件的

if (coords[0] != null && coords[1] != null && coords.length == 2) { 
     m.x[i] = Float.parseFloat(coords[0]); 
    m.y[i] = Float.parseFloat(coords[1]); 
} 

215線恰好是如果有條件本身。

即使更改後,錯誤仍然存​​在。

+0

哪條線是第215? – BackSlash

+0

嘗試改變'if(coords [0]!= null && coords [1]!= null){'to'if(coords.length == 2){' – johnchen902

+0

您可以檢查if條件的大小的數組coords.size> = 2 &&做你的驗證 – Siva

回答

0

你假設你總是會在coords中至少有兩個元素的數組,添加一些代碼來驗證你確實得到了一個至少有兩個元素的數組。

更改您的if語句:

if (coords.length >= 2) { 
    m.x[i] = Float.parseFloat(coords[0]); 
    m.y[i] = Float.parseFloat(coords[1]); 
} 
+0

更改if語句來驗證數組的長度 – morgano

1

我得到一個數組拋出IndexOutOfBoundsException當調用此功能,但並非總是如此。在10次嘗試中,我得到了3次錯誤,其餘7次都很好。

一是潛在的危險:

if (coords[0] != null && coords[1] != null) 

這裏我們假定你是coords陣列總會有2元素。

你的條件更改爲:

// check for coords.length == 2 first inside the if 
// if the first condition fails , others won't be evaluated for short circuit AND 
if (coords.length == 2 && coords[0] != null && coords[1] != null) { 
    m.x[i] = Float.parseFloat(coords[0]); 
    m.y[i] = Float.parseFloat(coords[1]); 
} 

其次,

m.x[i] = Float.parseFloat(coords[0]); 
m.y[i] = Float.parseFloat(coords[1]); 

xy可能不包含由i看重的指標。

向我們展示您的Model類,特別是屬性xy以及您如何初始化它們。

1

IndexOutOfBoundsException被拋出以指示某種索引(例如數組,字符串或向量)超出範圍。

在你的情況,我認爲下面的代碼行的決策問題,

String[] coords = line.split(","); 

你應該檢查它的長度coords.length訪問它。

0

首先檢查coords陣列的長度再往前作爲

if(coords.lenght()>=2) { 
    //here parse your float 
} 

它是由於未選中長度,你是假設coords長度將是2總是。

2

做這個改變

if (coords.length == 2 && coords[0] != null && coords[1] != null) { 
      m.x[i] = Float.parseFloat(coords[0]); 
     m.y[i] = Float.parseFloat(coords[1]); 
    } 
+0

我做到了。雖然沒有改變。 :( – wrahool

+0

給我線,你在哪裏得到新的異常 – MayurB

+0

你錯誤地應用了這個改變,'coords.length == 2'必須是第一個檢查if –