以下是输入:活动名称、日期、参加人数
餐饮聚会,2018年1月1日,100
婚礼,2018年1月24日,500
自行车特技表演,06/01/2018,300
下面是代码:
public static void main(String[] args) throws ParseException {
//SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<Event> events = new ArrayList<>();
for (int i = 0; i < n; i++) {
sc.next();
//String line=sc.nextLine();
String parts[] = sc.nextLine().split(", ");
//StringTokenizer st = new StringTokenizer(line,", ");
//int j=0;
//while(st.hasMoreTokens()) {
//System.out.println(st.nextToken());
//parts[j]=st.nextToken();
//j++;
//}
//System.out.println(j);
//String[] inputs = sc.nextLine().split(", ");`
for (String data : parts) {
System.out.println(data);
}
String name = parts[0].trim();
String date = parts[1].trim();
String attendee = parts[2].trim();
int count = Integer.parseInt(attendee);
events.add(new Event(name, date, count));
}
}
下面是错误:
3个1月1次
餐饮聚会,2018年1月1日,100
缔约方2018年1月1日100
婚礼,2018年1月24日,500
24/01/2018 500线程"main"中出现异常java. lang. ArrayIndex超出边界2在主服务器上。主服务器(Main.java:74)
我已经尝试了字符串令牌化器和拆分方法,但正如你所看到的错误,我不能采取正确的格式输入。请帮助我知道什么是错误的,在我的代码。
2条答案
按热度按时间gwbalxhn1#
您可能已经注意到,从调试日志中,即使在
IndexOutOfBoundsException
之前,您也没有得到正确的输出,这是由于您在for循环开始时添加了sc.next();
,这也是第二次迭代中出现异常的原因。到底发生了什么
编译器通过
sc.nextInt();
读取第一个非空格分隔的整数字符,然后,在for循环中,通过sc.next();
读取下一个非空格分隔的字符串,在你的例子中,就是单词"Catering"。在这之后,编译器会读取行的其余部分作为"party,01/01/2018,100"并对其进行操作,这就是为什么在sysout中只会得到单词"party"而不是"Catering party"。
下一行输入也是如此,只是这次整个"Wedding"被认为是一个
sc.next()
,所以最终得到的是"24/01/2018,500"和一个IndexOutOfBoundsException
。第一行起作用的唯一原因是它的第一个参数中有两个单词,所以它不影响拆分数组的大小。
溶液
我建议你在阅读下一部分之前尝试自己修复它。考虑使用调试器!这是一个非常有用的工具。
在读取初始数字输入
sc.nextInt()
之后,您应该添加sc.nextLine();
,以便编译器理解前一行已经完成,并且下一次读取应该在新的行上。您应该删除
sc.next();
,因为这没有任何作用(我猜您添加此内容是为了尝试解决编译器无法读取下一行的问题,如前所述)。最后,我建议您在
,
上拆分,而不是在,
上拆分,因为您无论如何都要修剪字符串。q8l4jmvw2#
在拆分输入之前,请尝试删除白色,以确保没有空格会影响分隔符,此外,您还必须检查用户是否输入了以逗号分隔的三个字段。以下是一个示例: