Java实现Atoi函数遇NumberFormatException,求代码错误排查
问题分析与错误修正
直接错误原因
你遇到的NumberFormatException是因为ans字符串为空时调用了Long.parseLong(ans)导致的,核心是代码逻辑存在多处错误,无法正确收集有效数字字符。
代码中的具体错误
- 空格判断错误:用
s.charAt(i) == 0判断空格是错误的,空格的ASCII码是32,这会导致无法跳过前置空格。 - 第一个循环条件与逻辑错误:
while (i < s.length() - 1)会提前终止循环,漏掉最后一个字符;且循环没有在遇到非空格时停止,而是盲目遍历到接近末尾,完全不符合"跳过前置空格"的需求。 - 符号处理逻辑错误:第一个循环结束后直接取末尾字符判断符号,正确逻辑应该是跳过空格后,检查当前字符是否是
+或-,再移动指针。 - 第二个循环死循环:循环内没有
i++操作,导致i值永远不变,程序陷入无限循环;同时循环条件i < s.length() - 1会漏掉最后一个字符。 - 未处理非数字终止逻辑:收集数字时,遇到非数字字符没有停止,会继续无效遍历。
- 未处理无数字场景:当输入没有有效数字时,
ans为空,调用Long.parseLong必然触发异常。 - 溢出未处理:当转换后的数值超出
int范围时,直接强转int会得到错误结果,需要返回Integer.MAX_VALUE或Integer.MIN_VALUE。
修正后的代码示例
class Solution { public int myAtoi(String s) { int n = s.length(); int i = 0; // 跳过前置空格 while (i < n && s.charAt(i) == ' ') { i++; } // 处理空字符串或全空格情况 if (i >= n) { return 0; } // 处理符号位 int sign = 1; if (s.charAt(i) == '+' || s.charAt(i) == '-') { sign = s.charAt(i) == '-' ? -1 : 1; i++; } long result = 0; // 收集数字并实时检查溢出 while (i < n && Character.isDigit(s.charAt(i))) { int digit = s.charAt(i) - '0'; // 提前判断是否会溢出int范围 if (result > (Integer.MAX_VALUE - digit) / 10) { return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE; } result = result * 10 + digit; i++; } return (int) (result * sign); } }
内容的提问来源于stack exchange,提问作者user_program
相关产品推荐
相关产品推荐

