Java字符ASCII码拼接长串转Integer触发NumberFormatException咨询
异常诱因定位
- 抛出
NumberFormatException的直接原因是转换数值超出int类型的可解析范围:Java中int是32位有符号整数,最大可解析的十进制数值为10位(上限2147483647),触发异常的输入字符串"74111104110"为11位十进制数,转换时直接超出int的解析阈值,触发格式校验失败。 - 代码逻辑存在两处隐藏缺陷,会持续放大溢出问题:
- 用于拼接ASCII码的
stringInt变量定义在遍历输入字符串的外层循环外,每处理完一个字符串,拼接得到的数字字符串没有被重置为空,下一次循环处理时会在上一次的拼接结果上继续追加字符的ASCII码,导致数值长度不受控增长,必然触发溢出。你遇到的异常字符串74111104110,正是残留前一次拼接的74,后续追加3个字符的ASCII码拼接形成的,和代码逻辑完全匹配 - 存储每个字符串转换结果的
sumArrayList使用int类型,本身的存储范围就不足以支撑稍长字符串拼接出的数值长度
- 用于拼接ASCII码的
- 原有最值判断逻辑存在硬编码缺陷:初始值固定写为
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
相关产品推荐
相关产品推荐

