有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java岩石、布、剪刀程序,带文件输入

我的线路有问题。字符(0)和行。查拉特(2)。我不断听到一个错误,说:

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!");     
      }
   }

}

任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    我不想给你问题的确切答案,而是要解释你如何自己去追求它

    首先,错误消息解释了错误是什么以及发生在哪里:

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

    。。。这意味着您试图访问字符串的第一个字符,但其中没有那么多字符

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

    。。。意思是它发生在字符串的658行。java好吧,这超出了你的控制范围;一串java是标准java库的一部分。但是这是由你的RockPaperScissor的31行代码调用的。爪哇

    如果您在IDE中运行,很可能可以单击消息中的行号,跳转到代码中的那一行

    现在,您深入了解了问题所在:在某个点上,它试图执行:

    char p1 = line.charAt(0);
    

    。。。但是line在该点上的值为""

    您可以在心里一步一步地执行,尝试找出line可能是空字符串的原因,这是一个很好的实践

    但是,通过在调试器中运行代码,您也可以学到很多东西。同样,如果您在IDE中,只需单击几下即可调试器。检查IDE的文档。或者jdb附带标准JDK,但使用起来不那么直观

    因为您知道您的问题是对line的赋值,所以在int cases=....行设置一个断点。在调试模式下启动程序。当到达该点时,它将暂停

    单击“步骤”按钮,查看分配给cases的值

    再次单击“步骤”按钮,查看分配给line的值

    继续这样走。当它达到你的期望时:好。当它做了一些你没有预料到的事情时,想一想为什么,也许阅读你正在调用的方法的Javadocs,然后再试一次

    通过查看您的代码,我可以看出,一旦您在line为空的情况下解决了这个问题,您将遇到更多的问题,但是使用调试器和您的大脑,您将能够处理所有这些问题