2014-02-18 28 views
1

我遇到了我的line.charAt(0)和line.charAt(2)的問題。我不斷收到一個錯誤消息:帶有文件輸入的Java岩石,紙張,剪刀程序

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
    at java.lang.String.charAt(String.java:658) 
    at RockPaperScissors1.main(RockPaperScissors1.java:31) 

我想不通爲什麼我那樣做。我的文件是這樣的:

3 
2 
R P 
S R 
3 
P P 
R S 
S R 
1 
P R 

這裏是我的程序:

import java.util.*; 
import java.lang.*; 
import java.io.*; 

public class RockPaperScissors1 
{ 

    public static void main(String[] args) throws IOException 
    {  
     File file = new File("a.txt"); 
     Scanner fin = new Scanner(file); 


     int cases = fin.nextInt(); 
     String line = fin.nextLine(); 
     int rounds = fin.nextInt(); 

     for(int i = 0; i<cases; i++) 
     { 
     int tie = 0; 
     int p1win = 0; 
     int p2win = 0; 

     for(int j=0; j<rounds; j++) 
     { 
      char p1 = line.charAt(0); 
      char p2 = line.charAt(2); 

      if (p1 == p2) 
       tie = tie + 1; 


      else if (p1 == 'R') 
      { 
       if (p2 == 'S') 
        p1win = p1win + 1; 

       else if (p2 == 'P') 
        p2win = p2win + 1; 
      } 

      else if (p1 == 'P') 
      { 
       if (p2 == 'S') 
        p2win = p2win + 1; 

       else if (p2 == 'R') 
        p1win = p1win + 1; 
      } 

      else if (p1 == 'S') 
      { 
       if (p2 == 'P') 
        p1win = p1win + 1; 

       else if (p2 == 'R') 
        p2win = p2win + 1; 
      } 

     } 

     if(p1win > p2win) 
      System.out.println("Player 1"); 
     else if(p2win > p1win) 
      System.out.println("Player 2"); 
     else 
      System.out.println("Tie!");  
     } 
    } 

} 

任何幫助,將不勝感激。

回答

0

與其給你一個問題的確切答案,我要解釋你如何能夠自己追逐它。

首先,錯誤消息,說明錯誤是什麼,並在那裏發生的事情:

java.lang.StringIndexOutOfBoundsException: String index out of range: 0 

...這意味着你要訪問字符串的第一個字符,但它不具備它裏面有很多角色。

at java.lang.String.charAt(String.java:658) 
at RockPaperScissors1.main(RockPaperScissors1.java:31) 

......這意味着它發生在String.java的第658行 - 好吧,那超出了你的控制範圍; String.java是標準Java庫的一部分。但是這是由你的代碼行31 RockPaperScissors1.java調用。

如果您在IDE中運行,則可能是您可以單擊消息中的行號以跳轉到代碼中的該行。

所以,現在你是一層深入的問題是什麼:在某些時候它試圖執行:

char p1 = line.charAt(0); 

...但line具有在該點的""值。

你可以在腦海中逐步執行,試圖找出爲什麼line可能是一個空字符串 - 這是一個好習慣。

但是,您也可以通過在調試器中運行代碼來了解很多。再次,如果你在IDE中,你只需要從調試器中點擊幾下鼠標。檢查你的IDE文檔。另外jdb附帶標準的JDK,但不太直觀。

既然您知道您的問題與line的分配有關,請在int cases=....行處設置一個斷點。在調試模式下啓動程序。當它達到那個點時它會暫停。

單擊「step」按鈕,查看分配給cases的值。

再次點擊'step'按鈕,看看分配給line的值。

繼續這樣。當它達到你的預期時:好。當它做了一些你沒有想到的事情時,想一想爲什麼,也許是爲你所調用的方法閱讀Javadocs,然後再試一次。

從查看你的代碼,我可以告訴你,一旦你已經通過line爲空,你會遇到更多的問題 - 但使用調試器和你的大腦,你將能夠與他們處理所有。

+0

所以我注意到我的代碼有「」(沒有)。 – user3230008

+1

明白了!調試器幫了很多,謝謝! – user3230008