You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:48:32