2014-03-04 34 views
0

如何在下面的代碼中阻止ArrayIndexOutofBoundsException,同時爲每個記錄轉換數據存儲標頭和值以準備插入查詢。防止Java中的ArrayIndexOutofBoundsException

BufferedReader reader = new BufferedReader(new FileReader("C:\\files\\test.dat")); 
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); 
int lineNumber = 1; 
String[] columnName = null; 
ArrayList<String[]> value = null; // temp array 
String line; 
String[] arr; 
List<String> headers = null; 

while (reader.ready()) 
    if (!(line = reader.readLine()).isEmpty()) { 
     arr = line.split("[\\r\\n]+"); 

     if (lineNumber == 1) { 
      lineNumber++; 
      continue; 
     } 
     if (lineNumber == 2) { 
      headers= Arrays.asList(arr[0].split("\\|")); 
      value=new ArrayList<String[]>(); 
     } 
     else 
      value.add(arr[0].split("\\|"));// create values 

     lineNumber++; 
    } 

// transform data 
for (int i = 1; i < headers.size(); i++) { 
    ArrayList<String> ar = new ArrayList<String>(); 

    for (int j = 0; j < value.size(); j++) 
     ar.add(value.get(j)[i]); // <---- Getting error here 

    map.put(headers.get(i), ar); 
} 

System.out.println(map); 

}

test.dat具有低於數據。在第4條記錄上面的代碼試圖檢索僱傭後,但沒有數據,因此代碼失敗。

"X"|"Y"|"12345 0000" 

"Emp No"|"Emp sal"|"Emp Name" 

1|23.4567|"jhon" 

2|0.4567|"steve" 

3|9.4567|"jhon" 

4|123 
+0

你在哪一行代碼中得到錯誤? – DNA

+0

索引超出範圍意味着您的邏輯中存在一個錯誤,您要經過數組的末尾。這個例外會告訴你到底發生了什麼。找出你做錯了什麼,並解決它。 – keshlam

+1

您可以使用'length()'方法檢查數組的長度,以確保訪問給定元素的安全性。然後,您需要決定如何處理缺失的數據(例如跳過該記錄,退出或打印錯誤等) – DNA

回答

2

不要假設,給定的數組或列表在給定的位置總是有一些元素。先檢查容器的大小!您所期待的是,每行包含與標題行相同數量的元素。所以在撥打value.get(j)[i]前請檢查value.get(j).length == headers.size()。如果沒有,你可以continue或拋出異常。