Java读取文件同一行字符串与整数时报NumberFormatException如何解决
问题原因
你碰到的NumberFormatException不是setName那行导致的,根本原因是你把拆分后的所有元素(包括第一个姓名)都传入了Integer.parseInt()做数字转换,姓名是纯字符串自然会抛出格式错误。同时你原代码的循环结构逻辑混乱:一行数据对应1个Bet对象,你却嵌套了多层循环,还在遍历拆分后元素的逻辑里递增j,会导致数组下标越界和数据存储错误。
修复方案
拆分每行得到字符串数组后,单独取下标为0的元素作为姓名赋值,从下标1开始遍历剩余元素做数字转换存入投注vector即可,调整后的代码如下:
public void betsReads() throws IllegalArgumentException, IOException { File betsFile = new File ("C:\\Temp\\bets.txt"); // 用try-with-resources自动关闭流,避免资源泄露 try (FileReader fr = new FileReader(betsFile); BufferedReader br = new BufferedReader(fr)) { int j = 0; String row; // 一行对应一个Bet对象,在读取行的循环里直接处理 while((row = br.readLine()) != null && j < size) { totalBets[j] = new Bet(); String[] strings = row.split(" "); // 第一个元素是姓名,单独赋值 totalBets[j].setName(strings[0]); // 从第二个元素开始遍历为投注数字 for(int i = 1; i < strings.length; i++) { Integer foo = Integer.parseInt(strings[i]); totalBets[j].vectorBers[i-1] = foo; } j++; } } System.out.println("BETS FILE READ SUCCESSFULLY"); }
注意事项
- 要保证
totalBets数组的长度大于等于文件的行数,vectorBers的长度大于等于每行投注数字的个数,避免下标越界 - 当前实现仅适用于姓名无空格、所有字段用单个空格分隔的场景,如果行首姓名可能包含空格,需要单独调整拆分规则
内容的提问来源于stack exchange,提问作者Lekost93
相关产品推荐
相关产品推荐

