Java提取$后金额求和出现NumberFormatException空串错误如何解决
异常原因
- 直接原因是
Long.parseLong()方法无法解析空字符串:你在每一轮外层字符遍历中都会创建新的空StringBuilder对象,只有当前遍历到的字符为$时才会往Builder中拼接内容,其余所有遍历场景下Builder都是空值,每次循环末尾直接调用转换方法就会触发格式异常。 - 代码还存在隐藏的下标越界风险:内层循环没有判断数组长度边界,如果
$出现在字符串最后一位,j = i+1会直接超出数组下标范围,抛出ArrayIndexOutOfBoundsException。
修复方案
- 将StringBuilder的创建、数值转换和累加逻辑都移动到
$匹配的分支内部,非$字符不需要做处理。 - 内层循环增加数组下标边界校验,避免越界。
- 转换前判断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
相关产品推荐
相关产品推荐

