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 楼答案
我不想给你问题的确切答案,而是要解释你如何自己去追求它
首先,错误消息解释了错误是什么以及发生在哪里:
。。。这意味着您试图访问字符串的第一个字符,但其中没有那么多字符
。。。意思是它发生在字符串的658行。java好吧,这超出了你的控制范围;一串java是标准java库的一部分。但是这是由你的RockPaperScissor的31行代码调用的。爪哇
如果您在IDE中运行,很可能可以单击消息中的行号,跳转到代码中的那一行
现在,您深入了解了问题所在:在某个点上,它试图执行:
。。。但是
line
在该点上的值为""
您可以在心里一步一步地执行,尝试找出
line
可能是空字符串的原因,这是一个很好的实践但是,通过在调试器中运行代码,您也可以学到很多东西。同样,如果您在IDE中,只需单击几下即可调试器。检查IDE的文档。或者
jdb
附带标准JDK,但使用起来不那么直观因为您知道您的问题是对
line
的赋值,所以在int cases=....
行设置一个断点。在调试模式下启动程序。当到达该点时,它将暂停单击“步骤”按钮,查看分配给
cases
的值再次单击“步骤”按钮,查看分配给
line
的值继续这样走。当它达到你的期望时:好。当它做了一些你没有预料到的事情时,想一想为什么,也许阅读你正在调用的方法的Javadocs,然后再试一次
通过查看您的代码,我可以看出,一旦您在
line
为空的情况下解决了这个问题,您将遇到更多的问题,但是使用调试器和您的大脑,您将能够处理所有这些问题