Java读取逗号分隔输入时数组越界问题求助
原Scanner代码数组越界异常原因分析
输入示例
事件名称, 日期, 参会人数 Catering party, 01/01/2018, 100 Wedding,24/01/2018,500 Bike Stunts show, 06/01/2018, 300
原Scanner代码
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(输入数量) Catering party, 01/01/2018, 100 party 01/01/2018 100 Wedding, 24/01/2018, 500 24/01/2018 500 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at Main.main(Main.java:74)
异常原因分析
Scanner读取逻辑完全错误
sc.next()方法默认以**空白字符(空格、换行、制表符)**作为分隔符,而你的输入中事件名称可能包含空格(如Catering party),且逗号与内容的空格格式不统一(有的有空格,有的没有)。这会导致sc.next()读取的内容完全不符合预期:- 第一次循环时,
sc.next()读取Catering,剩下的party, 01/01/2018, 100被sc.nextLine()获取,分割后得到3个元素,暂时能正常访问。 - 第二次循环时,
sc.next()读取Wedding,(因为没有空格分隔),sc.nextLine()只能获取24/01/2018, 500,用,分割后仅得到2个元素,此时访问parts[2]必然触发数组越界异常。
- 第一次循环时,
sc.nextInt()残留换行符的隐性影响
调用sc.nextInt()读取输入数量3后,Scanner不会自动读取行尾的换行符\n,这个残留的换行符会留在输入缓冲区中。虽然第一次循环的sc.next()会跳过空白,但后续的拆分逻辑已经破坏了整行读取的可能性,进一步加剧了读取混乱。
为什么BufferedReader能正常工作
BufferedReader的readLine()方法会直接读取整行文本(自动丢弃换行符),确保每一条事件数据被完整获取。后续用split(",")分割(不依赖逗号后的空格),再对每个元素做trim()处理,就能稳定得到三个字段,不会出现数组长度不足的问题。
内容的提问来源于stack exchange,提问作者alankar asthana
相关产品推荐
相关产品推荐

