2012-10-16 45 views
-1

我想寫一個程序,通過寫入一個文本文件來模擬數據庫。我可以讀取一個完整的數據文本文件來使用,然後將其轉換爲字節數組以存儲到另一個文本文件中。我遇到的問題是因爲我從字符串轉換爲字節數組我不斷收到java.lang.ArrayIndexOutOfBoundsException:8.我硬編碼值到我的for循環,以便它不應該是一個無效的索引陣列,但似乎沒有解決問題。這裏是我的功能,錯誤顯示了在:如何避免獲取java.lang.ArrayIndexOutOfBoundsException

public void writeBucket(int bucket, String importFile, String[][] allrecords) 
{ 

    theDisk = new FakeDisk(); 

    for(int z = 0; z < bucket; z++) 
    { 

    try 
    { 

     for(int j = 0; j < 7; z++)//for(int j = 0; j < allrecords[z].length; z++) 
     { 

     if(allrecords[z][j] == null) //this is the line where the error shows up 
     { 
      continue; 
     } 

     theDisk.writeSector(z, allrecords[z][j].getBytes()); 
     } 
    } 
    catch(Exception e) 
    { 
     //System.out.println(e.getMessage());//this prints the number 8 when not commented out 
     continue; 
    } 

    } 

    try 
    { 

    FileWriter fwrite = new FileWriter(importFile); 

    fwrite.write("\n\n\n\n"); 
    fwrite.close(); 

    } 
    catch (Exception e) 
    { 
    System.err.println("Error: " + e.getMessage()); 
    } 

} 

我把環在一個try/catch以爲這樣就至少還輸出字節到我的文本文件,然後沒有任何更多添加到文件一旦遇到無效索引,但事實並非如此。我主要無法弄清楚爲什麼我一直在收到這個錯誤。我可以打印出陣列沒有問題,如果我不嘗試寫入文本文件,所有內容都會顯示出來。

任何幫助表示讚賞!

+0

請打印堆棧跟蹤 – zaffargachal

+0

哪行代碼對應第8行的異常? –

+0

如何獲取存儲桶值,這似乎是導致異常,您可以發送代碼如何調用此方法,以及如何設置存儲桶變量值 – zaffargachal

回答

5

這就是問題所在:

for(int j = 0; j < 7; z++) 

看那環路初始化和循環條件,兩者均使用j - 然後查看增量,這正在更改z的值。

即使已註釋掉的版本仍然被破壞,因爲它仍在遞增z

事實上,根據我所見,根本不需要j。您可以在內環更改爲:

for (String text : allrecords[z]) 
{ 
    if (text == null) 
    { 
     continue; 
    } 
    theDisk.writeSector(z, text.getBytes()); 
} 

不過,我想強烈鼓勵你不要叫getBytes()沒有擺在首位的編碼。如果你真的想要默認平臺編碼,請明確指定。如果您想要其他編碼,如UTF-8,請指定。如果你不知道你想要什麼編碼,你需要退後一步,仔細考慮你的數據。

(這也是有點奇怪,我們在調用writeSectorz每次都相同的值...是不是要去只是覆蓋數據?)

+0

你好,謝謝你的信息!我正在使用的writesector方法應該寫入模擬的扇區號(我有z表示在循環中)。儘管如此,我不得不承認我不是100%確定的,因爲我沒有親自寫writeSector方法。 Java不是我的主要編程語言,所以我不幸遇到這些類型的錯誤。此外,也許你有一些洞察力,爲什麼當這個循環遞增運行固定,它不寫任何文件?這是由於沒有指定UTF-8? –

+0

@FrankA:不,沒有更多的信息是不可能的。我們不知道'allrecords [z]'是否有任何非空元素,我們不知道'writeSector'是什麼,等等。你應該調試代碼。 –

+0

嘿再次感謝您的幫助!事實證明,我正在使用的類中的方法不會提醒您它試圖寫入的文件是否設置爲null。只是我的教授正在測試我們作爲程序員的敏銳程度;) –

1

你有答案,你可以使用評價環路(好,而忽略z++,使用j++):

for(int j = 0; j < 7; z++) //for(int j = 0; j < allrecords[z].length; j++) 
+0

這實際上仍然給我同樣的越界錯誤。我評論說,看看硬編碼是否能解決任何問題。我仍然得到相同的錯誤,如果我硬編碼值爲1而不是7也 –

+0

@Nandkumar。不解決問題..OP在兩個循環中遞增'z'。 –

+0

@RohitJain:是的,編輯答案,即使我沒有注意到:) –

1

在內部循環,它應該是j ++,不是z ++:

for(int j = 0; j < 7; j++) 
-1

試試這個,這樣你就不會得到ArrayIndexOutOfBoundException。在2d 數組的情況下,.length將給出第一個索引的長度。 和allrecords[z].length將給出第二個索引的長度。

for(int z = 0; z < allrecords.length; z++) 


for(int j = 0; j < allrecords[z].length; z++) 
+2

這是行不通的。問題是內部循環中的z ++而不是j ++。 – Pablo

+0

同意,比內部循環條件應該是j rbhawsar