You need to enable JavaScript to run this app. Java字符ASCII码拼接长串转Integer触发NumberFormatException咨询
优惠活动
大模型
产品
解决方案
定价
更多

Java字符ASCII码拼接长串转Integer触发NumberFormatException咨询

异常诱因定位
  • 抛出NumberFormatException的直接原因是转换数值超出int类型的可解析范围:Java中int是32位有符号整数,最大可解析的十进制数值为10位(上限2147483647),触发异常的输入字符串"74111104110"为11位十进制数,转换时直接超出int的解析阈值,触发格式校验失败。
  • 代码逻辑存在两处隐藏缺陷,会持续放大溢出问题:
    1. 用于拼接ASCII码的stringInt变量定义在遍历输入字符串的外层循环外,每处理完一个字符串,拼接得到的数字字符串没有被重置为空,下一次循环处理时会在上一次的拼接结果上继续追加字符的ASCII码,导致数值长度不受控增长,必然触发溢出。你遇到的异常字符串74111104110,正是残留前一次拼接的74,后续追加3个字符的ASCII码拼接形成的,和代码逻辑完全匹配
    2. 存储每个字符串转换结果的sumArrayList使用int类型,本身的存储范围就不足以支撑稍长字符串拼接出的数值长度
  • 原有最值判断逻辑存在硬编码缺陷:初始值固定写为max=0、min=99999,如果所有转换得到的ASCII拼接值都大于99999、或小于0,会出现最值判断完全错误的问题
修复方案
  • 将stringInt的初始化移到单个字符串处理的逻辑内部,每次处理新字符串时重置为空字符串,避免历史拼接内容残留
  • 替换数值承载类型:将存储ASCII拼接结果的int数组替换为long类型数组,long为64位有符号整数,可承载19位十进制数,足够覆盖常规输入场景下的数值长度
  • 修正最值判断的初始值逻辑:直接取数组第一个元素作为max和min的初始值,避免硬编码初始值导致的判断错误

核心修复逻辑参考代码段:

public static void minMax(int sizeN, ArrayList<String> N){
    long[] sumArrayList = new long[sizeN];
    int temp = 0;
    for(int i = 0; i < sizeN; i++){
        String stringInt = ""; // 每次处理新字符串时重新初始化
        for(int j = 0; j<N.get(i).length(); j++){
            temp = (int) N.get(i).charAt(j);
            stringInt += String.valueOf(temp);
        }
        sumArrayList[i] = Long.valueOf(stringInt); // 用Long类解析适配更长数值
    }
    // 初始化最值,避免硬编码初始值导致的判断错误
    long max = sumArrayList[0];
    long min = sumArrayList[0];
    for (long val : sumArrayList) {
        if (val > max) {
            max = val;
        }
        if (val < min) {
            min = val;
        }
    }
    System.out.println("["+min+","+max+"]");
}

注:如果输入字符串长度非常长(超过18个英文字符),拼接后的数值仍可能超出long的存储范围,此时可使用BigInteger类承载数值,避免溢出。

内容的提问来源于stack exchange,提问作者robertoburst23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 10:15:02