Java11操作ArrayList排序计算调整平均值出现NumberFormatException如何解决
错误原因
NumberFormatException由字符串转数值类型时格式不匹配触发,你的代码中存在两处触发场景:- 读取列表长度N时,输入内容不是合法整数(包含空行、非数字字符、前后有多余空格、输入为小数等),
Integer.parseInt()无法解析 - 读取列表元素时,你用
Integer.parseInt()解析输入值,但你定义的存储数组是double类型,如果输入值为小数、包含非数字字符、实际输入元素数量和N不匹配,都会触发报错
- 读取列表长度N时,输入内容不是合法整数(包含空行、非数字字符、前后有多余空格、输入为小数等),
- 你使用的算法逻辑本身是正确的,问题完全出在输入解析环节。
修复方案
- 增加输入合法性校验,捕获解析异常做兼容处理
- 如果允许输入的列表元素是小数,将元素解析逻辑替换为
Double.parseDouble(),避免小数格式的输入被Integer.parseInt()拒绝 - 读取输入时主动去除字符串前后的空白字符,避免空格导致的解析失败
修复后代码
import java.io.*; import java.util.*; public class Main{ public static void main(String[] args)throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 校验N的输入合法性 int N; while (true) { try { N = Integer.parseInt(br.readLine().trim()); if (N > 0) break; System.out.println("请输入大于0的合法长度"); } catch (NumberFormatException e) { System.out.println("输入格式错误,请输入整数长度"); } } StringTokenizer st = new StringTokenizer(br.readLine().trim()," "); double[] grades = new double[N]; for(int i = 0; i < N; i++){ // 改用Double解析,兼容小数输入 grades[i] = Double.parseDouble(st.nextToken().trim()); } double sum = 0; Arrays.sort(grades); double max = grades[grades.length-1]; for(int i = 0; i < grades.length; i++){ sum += (grades[i]/max)*100; } System.out.println(sum/grades.length); } }
内容的提问来源于stack exchange,提问作者newJava
相关产品推荐
相关产品推荐

