使用split方法解析文件内容时遭遇NumberFormatException问题求助
NumberFormatException 错误原因及解决办法
错误根源
你遇到的java.lang.NumberFormatException: For input string: "Sug",本质是文本拆分后的数组元素错位,导致本该解析成数字的位置拿到了字符串"SUG",调用Integer.parseInt()时触发异常。
问题出在你使用的split分隔符:
String[] text = line.split(" | ");
这个写法等价于split(" "),会把单个空格当作分隔符。但如果你的文本文件中是多个连续空格分隔字段,这种拆分方式会生成包含空字符串的数组,比如原行是T001 SUG 12 3 8.30 HANOI(两个空格分隔),拆分后数组的元素顺序会乱,text[2]可能不是数字12,而是空字符串或者"SUG",后续转数字自然报错。
解决办法
1. 修正split的分隔符
用正则表达式\\s+匹配一个或多个连续空白字符(空格、制表符都能匹配),确保不管有多少个连续空格,都只会当成一个分隔符,拆分出干净的元素数组:
String[] text = line.split("\\s+");
2. 增加格式校验(可选但推荐)
在解析前先判断数组长度是否符合预期(应该是6个元素),避免因行格式错误导致的索引越界问题:
if (text.length != 6) { System.out.println("跳过格式无效的行:" + line); continue; }
修改后的完整代码
public static SLL<train> readFile() { SLL<train> list = new SLL(); try { FileReader fr = new FileReader("Train.dat"); BufferedReader br = new BufferedReader(fr); String line; // 简化循环写法 while ((line = br.readLine()) != null) { String[] text = line.split("\\s+"); if (text.length != 6) { System.out.println("无效行:" + line); continue; } String tcode = text[0]; String train_name = text[1]; int seat = Integer.parseInt(text[2]); int booked = Integer.parseInt(text[3]); double depart_time = Double.parseDouble(text[4]); String depart_place = text[5]; train t = new train(tcode, train_name, seat, booked, depart_time, depart_place); list.addLast(t); } br.close(); fr.close(); } catch (Exception e) { e.printStackTrace(); } return list; }
内容的提问来源于stack exchange,提问作者Nguyen Dang
相关产品推荐
相关产品推荐

