我需要这个程序接受以下格式的用户输入:" team1:team2:score1:score2"然后将它分配给下面的数组变量,这样工作正常,但现在我需要在用户输入“停止”时才这样做。程序显示数组中数据的结果和统计信息。 问题是,当你输入stop时,它会尝试将它添加到数组中,但由于我将输入分成4个部分,它只是给我一个错误(例外)
" java.lang.ArrayIndexOutOfBoundsException" " awayteam =上的错误 结果[1];"线。
我的问题是:如果用户输入“停止”,我怎么能这样做?它没有尝试将它添加到数组中。
// Sample input: Chelsea : Arsenal : 2 : 1
public static final String SENTINEL = "stop";
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String hometeam = new String();
String awayteam = new String();
String homescore = new String();
String awayscore = new String();
int result0;
int result1;
int sum = 0;
System.out.println("please enter match results:");
for (int b = 0; b < 100; b++) {
String s = sc.nextLine();
String results[] = s.split(" : "); // parse strings in between the
// dash
// character
for (String temp : results) {
hometeam = results[0];
awayteam = results[1];
homescore = results[2];
awayscore = results[3];
}
//convert 'score' strings to int value.
result0 = Integer.valueOf(results[2]);
result1 = Integer.valueOf(results[3]);
//stop command
if (s.equals(SENTINEL)) {
System.out.println("stopped");
}
// print results
}
}
}
答案 0 :(得分:2)
在尝试解析之前,您只需检查哨兵并突破for循环。
另外,你的其他for循环不正确。您将相同的值放入变量N次。 (我添加了一个标注不正确的评论)
System.out.println("please enter match results:");
for (int b = 0; b < 100; b++) {
String s = sc.nextLine();
//CHECK FOR SENTINAL MATCH RIGHT AFTER READING THE NEXT LINE
if (s.equals(SENTINAL)) {
break;
}
String results[] = s.split(" : "); // parse strings in between the
// dash
// character
for (String temp : results) { // You don't need this for loop
hometeam = results[0];
awayteam = results[1];
homescore = results[2];
awayscore = results[3];
}
//convert 'score' strings to int value.
result0 = Integer.valueOf(results[2]);
result1 = Integer.valueOf(results[3]);
//stop command
if (s.equals(SENTINEL)) {
System.out.println("stopped");
}
// print results
}
答案 1 :(得分:1)
移动部件&#34;停止&#34;用break
打破循环。
if (s.equals(SENTINAL)) {
System.out.println("Stopped");
break;
}
之前split(" : ")
而且你也不需要一个假的for循环。
您可以这样做:
while ( sc.hasNextLine() )
{
String s = sc.nextLine();
if (s.equals(SENTINAL)) {
break;
}
.....
}
sc.close();
还要记得关闭扫描仪 - sc.close();
答案 2 :(得分:0)
你只需要测试它是否&#34;停止&#34;在添加数组之前:
while (sc.hasNextLine()){ // better than the for loop
String line = sc.nextLine();
if ("stop".equals(line)){
System.out.println("stopped");
return; // exit
}
String[] results = line.split(" : ");
// ...
}
答案 3 :(得分:0)
在尝试解析之前,您需要检查“s”是否等于或包含“stop”。你得到一个数组越界的原因是因为你的程序在检查用户是否进入stop之前试图解析。
尝试将代码更改为
String s = sc.nextLine();
if(!s.contains("stop")){
String results[] = s.split(" : "); // parse strings in between the
// dash
// character
for (String temp : results) {
hometeam = results[0];
awayteam = results[1];
homescore = results[2];
awayscore = results[3];
}
//convert 'score' strings to int value.
result0 = Integer.valueOf(results[2]);
result1 = Integer.valueOf(results[3]);
//stop command
if (s.equals(SENTINEL)) {
System.out.println("stopped");
}
} else {
//display results
}
这将告诉您的程序,只有当下一行不包含“停止”时,它才会尝试解析该行。 如果它包含停止,则应显示结果
编辑:注意到ControlAltDel的回答他解释说其中一个for循环不需要,所以我从答案中删除了