2013-05-31 69 views
1

我想放棄,但我必須這樣做,所以你是我的最後希望。我想這是一個簡單的問題,但我看不出有什麼問題。下面的代碼:與FileReader,ArrayIndexOutOfBounds奇怪的陣列情況

int i = -1; 
    String[][] dan = new String[20][13]; 
    try { 
    FileReader odczytanie = new FileReader("Kontrahenci.txt"); 
    BufferedReader bufor = new BufferedReader(odczytanie); 
    String str; 
    str = bufor.readLine(); 
    System.out.println(str); 
    while ((str = bufor.readLine()) != null) { 
     i = i + 1; 
     String[] ar = {null, null, null, null, null, null, null, null, null, null, null, null, null}; 
     ar=str.split("; "); 
     for(int j = 0; j < 13; j++) 
      dan[i][j] = ar[j]; 
     for(int j = 0; j < 13; j++) 
      System.out.println(dan[i][j]); 
    } 
    bufor.close(); 
    } catch (IOException e) { 
      System.out.println("File Read Error"); 
     } 

所以,當我嘗試運行它,我收到此錯誤:

"Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1" 

這條線:

for(int j = 0; j < 13; j++) 
    System.out.println(ar[j]); 

在一個文件我已經三行字以分號分隔。該代碼完美適用於第一行,但收到​​錯誤後。不知道什麼是錯的。

+0

你的代碼中有神奇的數字(20,13)。用常量替換那些。 – ashes999

+2

您提到的兩行代碼在上面的代碼中不可用 – home

+0

將您的調試器設置爲引發並檢查ar的內容(和大小)以及失敗的j的值的行。 – ashes999

回答

0

硬編碼13似乎有點可疑。您爲ar設置的值將被分配的分配覆蓋。 ar不一定有13個字段。什麼

for (int j = 0; j < ar.length ; j++) 

甚至更​​好

for (String s: ar) 

數據必須以某種方式格式不正確或不你期待什麼。嘗試斷言適當的尺寸或打印它。

同樣傑裏指出,固定大小的數組是不好的做法。你最好使用一些高級集合,比如List of HashMaps或其他自動增長的東西。

一個缺口是檢查i < 20之前索引與我然後拋出一個異常或斷言。這會讓你指向正確的方向。您也可以將它添加到while循環中,但這可能會導致數據未讀。

+0

這將解決'ar'問題,但不是'dan'。 – jerry

+0

非常感謝!我有兩個錯誤,一個是13,另一個是textfile。我花了大約2個小時思考,你做得很快,呃;] – Zano

0
String[] ar = {null, null, null, null, null, null, null, null, null, null, null, null, null}; 
ar=str.split("; "); 

ar 13個空值這個聲明將立即str.split("; ");被覆蓋,所以你不能假設數組的大小將始終是13,而不是使用13爲上限您對的循環我會建議使用ar.len或嘗試每個循環。

我懷疑你的dan陣列也會有相同的IndexOutOfBoundsError

你應該避免使用幻數。

0

您應該弄清楚有多少行是在文件中創建陣列之前或切換到的東西,可以讓大小改變:

ArrayList<String[]> dan = new ArrayList<String[]>(); 
try 
{ 
    BufferedReader bufor = new BufferedReader(new FileReader("Kontrahenci.txt")); 
    while (bufor.ready()) 
    { 
     dan.add(bufor.readLine().split("; ")); 
    } 
    bufor.close(); 
} 
catch (IOException e) 
{ 
    System.out.println("File Read Error"); 
} 

for(String[] ar : dan) 
{ 
    for(String s : ar) 
    { 
     System.out.println(s); 
    } 
} 

我沒有改變你的錯誤處理,但要注意如果有例外情況,您不會撥打close