Java中字符串转Long/Int遇NumberFormatException问题求助
解决你的NumberFormatException与数值溢出问题
嘿,你的问题根源其实很清晰——你拼接出来的数字字符串太长了,远远超出了long甚至double能承载的范围!
为什么会出错?
咱们先掰扯清楚原因:
- Long的上限不够用:Java里
long最多能存19位数字(最大值是9223372036854775807),但你把256个字符的ASCII码(每个ASCII是1-3位)拼接起来,得到的字符串有好几百位,Long.parseLong()根本处理不了,直接抛NumberFormatException太正常了。 - Double也顶不住:
double虽然能存更大的数,但它有个上限Double.MAX_VALUE(大概是1.7976931348623157E308),你的拼接数字远超这个值,自然就变成Infinity了。
看你的代码,问题就出在makeKeyNumber方法里——你把每个字符的ASCII码直接拼成长字符串,这完全是在制造一个超级大的数字,普通数值类型根本装不下:
private long makeKeyNumber(char[] key) { StringBuilder keyString = new StringBuilder(); for(int i = 0; i<key.length; i++) { int ascii = (int) key[i]; keyString.append(ascii); // 这里直接拼接,导致字符串超长到离谱 } String s = keyString.toString(); long keyNum = Long.parseLong(s); // 超出long范围,必抛异常 return keyNum; }
该怎么改?
你不需要把所有ASCII码拼成一个超大数字,换个思路把256个字符的信息压缩成合适的数值就行,给你几个可行方案:
方案1:用哈希算法(最推荐)
直接利用哈希把字符数组转成固定长度的数值,简单又高效:
private long makeKeyNumber(char[] key) { String keyStr = new String(key); int hash = keyStr.hashCode(); // 把int哈希扩展成long类型 return (long) hash ^ (hash >>> 32); }
如果需要更安全的哈希,也可以用MessageDigest生成MD5/SHA哈希,再转成long。
方案2:逐步处理每个字符(自定义逻辑)
循环的时候直接把ASCII码合并到结果里,避免生成超长字符串:
private long makeKeyNumber(char[] key) { long result = 0; for (char c : key) { int ascii = (int) c; // 用移位+异或的方式合并,每次保留8位ASCII信息 result = (result << 8) ^ ascii; // 也可以用累加取模:result = (result + ascii) % Long.MAX_VALUE; } return result; }
方案3:用BigInteger(真要存完整数值的话)
如果你铁了心要保留所有ASCII拼接的完整数字,那就用BigInteger,它支持任意长度的整数:
private BigInteger makeKeyNumber(char[] key) { StringBuilder keyString = new StringBuilder(); for(int i = 0; i<key.length; i++) { int ascii = (int) key[i]; keyString.append(ascii); } return new BigInteger(keyString.toString()); }
记得把类里的keyNumber改成BigInteger类型哦。
最后说一句
你之前的思路是把一堆小数字拼成一个巨无霸,这显然不符合数值类型的设计逻辑,换个压缩或者用大数值类型的思路,问题就迎刃而解啦。
内容的提问来源于stack exchange,提问作者Moots420
相关产品推荐
相关产品推荐

