所以我在UVa在线问题判断上遇到了一些问题,但是在相关性问题上,我继续得到一个ArrayIndexOutOfBoundsException。要理解代码,请参阅problem.
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
int sum = 0;
for (int i = 0; i <= t; i++){
String d = scan.nextLine();
if (d.equals("report")) {
System.out.println(sum);
} else {
String[] parts = d.split(" ");
int z = Integer.parseInt(parts[1]);
sum+=z;
}
}
}
}
错误消息是:
reportException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Main.main(Main.java:16)
我正在使用给出的示例输入。
编辑: 我已经尝试在代码中添加了println语句,并发现该数字未被读取。我想了解原因。
答案 0 :(得分:0)
错误消息表示数组parts
的长度小于2,有时
这意味着变量d
不始终包含字符串 BLANK SPACE ,“”,您拆分的内容。
试试这段代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
int sum = 0;
for (int i = 0; i <= t; i++){
String d = scan.nextLine();
if (d.equals("report")) {
System.out.println(sum);
} else {
String[] parts = d.split(" ");
/*
* Add IF statement,
*/
if (parts.length() > 1) {
int z = Integer.parseInt(parts[1]);
sum+=z;
}
}
}
}
}
答案 1 :(得分:0)
好吧,在我的机器上乱搞一下后,我想我发现了至少可能是问题的一部分。问题是,我不确定准确的输入是什么,所以我将在我的机器上工作。
所以你启动你的程序,它等待这一行的提示:
int t = scan.nextInt();
输入整数,程序按预期继续:
Input: 100 // Then press enter to continue
解析输入,现在t
设置为100。
然后,当您的程序进入for
循环时,会遇到以下行:
String d = scan.nextLine();
但由于某种原因,程序不等待输入! (或者至少它不在我的机器上)
我认为问题出在这里:
Input: 100 // Then press enter to continue
^^^^^^^^^^^
我认为您的输入是真的
Input: 100\n
^^
当您按Enter键时,该字符(Windows上为\r\n
)是输入的内容。这是一个换行符,告诉控制台转到下一行。
因此,我认为发生的是:
Input: 100\n
扫描程序解析100
,将\n
留在输入流中
然后在nextLine()
调用时,扫描程序在输入流上看到\n
,表示行尾,因此它认为您已输入整行!因为它认为你的输入只是换行符,它返回一个空字符串,因为你的“输入”是一个空字符串和换行符。然后你的程序按空格分割换行符,正确地返回一个包含单个元素的数组,然后你的程序在访问越界索引时会立即崩溃。
更好的方法是首先读取整行并解析整数,这样扫描仪就不会先于自己,如下所示:
int t = Integer.parseInt(scan.nextLine());
正如警告:这是我能够在我的机器上使用OP代码时提出的。我无法得到parts
中唯一的元素是"donate"
的情况。随着我获得更多信息,我会进一步更新。