You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java11操作ArrayList排序计算调整平均值出现NumberFormatException如何解决

错误原因

  • NumberFormatException 由字符串转数值类型时格式不匹配触发,你的代码中存在两处触发场景:
    1. 读取列表长度N时,输入内容不是合法整数(包含空行、非数字字符、前后有多余空格、输入为小数等),Integer.parseInt() 无法解析
    2. 读取列表元素时,你用 Integer.parseInt() 解析输入值,但你定义的存储数组是double类型,如果输入值为小数、包含非数字字符、实际输入元素数量和N不匹配,都会触发报错
  • 你使用的算法逻辑本身是正确的,问题完全出在输入解析环节。

修复方案

  1. 增加输入合法性校验,捕获解析异常做兼容处理
  2. 如果允许输入的列表元素是小数,将元素解析逻辑替换为Double.parseDouble(),避免小数格式的输入被Integer.parseInt()拒绝
  3. 读取输入时主动去除字符串前后的空白字符,避免空格导致的解析失败

修复后代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:24:02