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

Java提取$后金额求和出现NumberFormatException空串错误如何解决

异常原因
  • 直接原因是Long.parseLong()方法无法解析空字符串:你在每一轮外层字符遍历中都会创建新的空StringBuilder对象,只有当前遍历到的字符为$时才会往Builder中拼接内容,其余所有遍历场景下Builder都是空值,每次循环末尾直接调用转换方法就会触发格式异常。
  • 代码还存在隐藏的下标越界风险:内层循环没有判断数组长度边界,如果$出现在字符串最后一位,j = i+1会直接超出数组下标范围,抛出ArrayIndexOutOfBoundsException。
修复方案
  1. 将StringBuilder的创建、数值转换和累加逻辑都移动到$匹配的分支内部,非$字符不需要做处理。
  2. 内层循环增加数组下标边界校验,避免越界。
  3. 转换前判断Builder的内容长度,确认提取到有效数字后再执行转换累加。
修复后完整代码
package com.example.demo;

public class DemoApplication2 {
    public static void main(String args[]) {
        long sum = 0;
        String str = "#1 Tickets $50,000 Received $40. Expenses. ChequE.";
        char[] chararray = str.toCharArray();

        for (int i = 0; i < chararray.length; i++) {
            if (chararray[i] == '$') {
                StringBuilder someString = new StringBuilder();
                // 新增下标边界判断,避免数组越界
                for (int j = i + 1; j < chararray.length && (Character.isDigit(chararray[j]) || chararray[j] == ','); j++) {
                    if (Character.isDigit(chararray[j])) {
                        someString.append(chararray[j]);
                    }
                    i = j;
                }
                // 仅当提取到有效数字后再做转换累加
                if (someString.length() > 0) {
                    sum += Long.parseLong(someString.toString());
                }
            }
        }
        System.out.println(sum);
    }
}

运行上述代码输出结果为50040,符合预期。

内容的提问来源于stack exchange,提问作者zabi khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:36:03