通过ASCII转换将字符串转为long时触发数字格式异常如何解决
问题原因
- 首先
long类型取值范围有限:Java中long是64位有符号整数,最大值为9223372036854775807,仅支持最多19位的十进制数。而每个ASCII字符对应的数值占1~3位,比如字符a对应ASCII码97(2位)、字符DEL对应ASCII码127(3位),只要输入字符串长度超过9个字符,拼接后的数字串长度就会超过19位,超出long的取值范围,触发NumberFormatException。 - 输入空字符串/空值时,拼接得到的是空串,无法被解析为合法数值也会抛出异常。
- 你粘贴的代码存在语法错误:方法定义行
public long AsciiFromString(String inString)后缺少左大括号{,会直接编译失败。
解决方案
根据你的需求可以选择以下任意一种方案:
方案1:改用BigInteger存储拼接结果(保留ASCII拼接逻辑,无长度限制)
如果必须保留「每个字符ASCII码直接拼接」的逻辑,改用无长度上限的BigInteger类型存储结果即可,代码示例:
import java.math.BigInteger; public class MyClass { public BigInteger AsciiFromString(String inString) { // 空值校验 if (inString == null || inString.isEmpty()) { throw new IllegalArgumentException("输入字符串不能为空"); } StringBuilder tempString = new StringBuilder(); for (int i = 0; i < inString.length(); i++) { char c = inString.charAt(i); tempString.append((int) c); } return new BigInteger(tempString.toString()); } }
方案2:使用64位哈希算法(固定返回long类型,冲突概率极低)
如果必须返回long类型,放弃ASCII拼接逻辑,改用成熟的64位哈希算法,比如FNV-1a 64位哈希,得到的结果天然是long类型,不会溢出,且唯一性满足绝大多数场景需求,代码示例:
public class MyClass { public long AsciiFromString(String inString) { if (inString == null || inString.isEmpty()) { throw new IllegalArgumentException("输入字符串不能为空"); } // FNV-1a 64位哈希初始值和质数 long fnvPrime = 0x100000001b3L; long hash = 0xcbf29ce484222325L; for (char c : inString.toCharArray()) { hash ^= c; hash *= fnvPrime; } return hash; } }
方案3:限制输入长度
如果必须保留ASCII拼接逻辑同时返回long,提前校验输入字符串长度,确保拼接后的数字串长度不超过19位,超出时直接抛出参数异常即可。
内容的提问来源于stack exchange,提问作者TheUltimateHack
相关产品推荐
相关产品推荐

