2014-02-18 2 views
1

У меня проблема с моими линиями.charAt (0) и line.charAt (2). Я продолжаю получать сообщение об ошибке:Java rock, бумага, программа для ножниц с файловым вводом

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) 

... что означает, что это происходит на линии 658 String.java - ну, это не под вашим контролем; String.java является частью стандартной библиотеки Java. Но это вызвано вашей кодовой строкой 31 RockPaperScissors1.java.

Если вы работаете в среде IDE, вероятно, вы можете щелкнуть номер строки в сообщении, чтобы перейти к этой строке в коде.

Так что теперь вы один слой глубоко в то, что проблема: в какой-то момент он пытается выполнить:

char p1 = line.charAt(0); 

... но line имеет значение "" в этой точке.

Вы можете выполнить ментальное выполнение, чтобы попытаться выяснить, почему line может быть пустой строкой - и это хорошая практика.

Но вы также можете многому научиться, запустив код в отладчике . Опять же, если вы находитесь в среде IDE, вы всего на пару кликов от отладчика. Проверьте документацию IDE. Альтернативно, jdb поставляется со стандартным JDK, но менее интуитивно понятен в использовании.

Поскольку вы знаете, что ваша проблема связана с назначением line, установите точку останова на линии int cases=..... Запустите программу в режиме отладки. Он остановится, когда достигнет этой точки.

Нажмите кнопку «шаг» и посмотрите на значение, присвоенное cases.

Нажмите кнопку «шаг» еще раз и посмотрите на значение, присвоенное line.

Продолжайте движение таким образом. Когда он делает то, что вы ожидаете: хорошо. Когда он делает что-то, чего вы не ожидали, подумайте, почему, возможно, прочитайте Javadocs для метода, который вы вызываете, и повторите попытку.

От взгляда на ваш код я могу сказать, что после того, как вы пройдете мимо этой проблемы, если line пуст, вы столкнетесь с еще несколькими проблемами, но с помощью отладчика и вашего мозга вы сможете иметь дело с ними.

+0

Так что я заметил, что мой штрих-код получил «» (ничего). – user3230008

+1

Получил это! Отладчик очень помог, спасибо! – user3230008