2012-09-26 77 views
0

以下代碼應從.dat文件讀取5個字符串,然後從每個字符串中打印每個單獨的字符。Java charAt()方法在For循環中崩潰

File file = new File("tictactoe.dat"); 
Scanner scan = new Scanner(file); 
String str = ""; 
int x; 
for (x = 0; x < numGames; x++) { 
    str = scan.nextLine(); 
    for (int i = 0; i < str.length(); i++) { 
     out.println(str.charAt(i)); 
    } 
} 

但是程序會拋出一個StringIndexOutOfBoundsExceptionScanner沒有什麼不對,因爲測試表明它在我的文件中記錄了每一行。但是當試圖獲取並在每個字符串中打印某個字符時,程序會崩潰。

奇怪的是,在循環外charAt()工作沒有錯誤。

爲什麼在循環中調用方法會導致程序崩潰?

更新:我犯了一些荒謬的錯誤複製我使用的代碼。請參閱上面的更新代碼。此外,由於StringIndexOutOfBoundsException,該程序「崩潰」,我不感興趣。

+1

是否每個行至少有numGames字符呢? –

+0

是的。沒有問題的字符串的長度。 –

+2

當你說「崩潰」時,你的意思是一個致命的異常(具有我們可以看到的堆棧跟蹤的事情)或JVM轉儲式崩潰? – user1201210

回答

0

混淆的行數,以字符數你的循環是不是做你想要做的事。你說:

...然後打印每個字符串中的每個單獨的字符。

但是它實際上做的是獲取第1行,只打印該行的第一個字符,然後獲取第二行並打印第二個字符,第三行和第三個字符等。如果要在單獨的一行中打印每個字符,則需要在第一個字符的第一個循環內循環遍歷字符串中的字符,以便打印所有單個字符。

char[] characters = str.toCharArray(); 
for (int i = 0; i < characters.length; i++) { 
    System.out.println(characters[i]); 
} 

甚至更​​好,如果你使用一個for-each循環:

for (char c : str.toCharArray()) { 
    System.out.println(c); 
} 
+0

或者只是'System.out.println(str)',並避免將所有字符串拆開並重新放回。 –

+0

注意我使用'println'而不是'print'。我說:「如果你在一個單獨的行上打印每個字符,......」但是,當然,如果你只是在一行上打印字符,那麼'println(str)'更好。 – Brian

+0

請參閱最新的代碼。 –

1

我預料錯誤是StringIndexOutOfBoundsException,因爲你打印第一行的第一個字母和第二行的第二個字母,等等。因爲你不檢查這樣一個字母是否存在,指出那條線不那麼長。

如果不是因爲我會

  • 讀異常張貼的問題。
  • 通過您的代碼與調試器一起查找代碼中的錯誤。
+0

@PaulTomblin太真實了,我希望更清楚,謝謝。 –

+0

請參閱最新的代碼。 –

0

你的邏輯中有些奇怪的東西。假設DAT是:

12345 
67890 
abcde 
fghij 
klmno 

你的代碼將打印:

1 
7 
c 
i 
o 

畢竟,你調用「掃描線」 numGames時間,抓住了每個新行X位置。

+0

請參閱更新的代碼。 –

1

你在每一行

File file = new File("tictactoe.dat"); 
Scanner scan = new Scanner(file); 
String str = ""; 
int x; 
int y; 
for (x = 0; x < numGames; x++) { 
    str = scan.nextLine(); 
    for (y = 0; y<str.length(); y++) 
    { 
     out.println(str.charAt(y)); 
    } 
} 
+0

你是對的。這實際上是我的初始代碼。請參閱更新的問題。 –