如何修复Java应用题求解算法中的ArrayIndexOutOfBoundsException错误
问题修复:Java数学应用题算法数组越界错误
错误原因分析
抛出的ArrayIndexOutOfBoundsException核心原因是你硬编码访问了数组不存在的索引。以输入句子"if ben has 3 apples and bee has 4 apples how many apples do they have all together"为例:
- 用
"and"拆分后得到的数组parsedLine[0]长度仅为2,但你在num1数组里尝试访问parsedLine[0][2]和parsedLine[0][3],这两个索引根本不存在,直接触发越界错误。 - 同时用逗号、句号、"more"拆分原句时,得到的数组长度可能只有1,后续访问索引1及以上也会报错。
本质问题是错误假设所有拆分后的数组都有4个元素,且拆分逻辑混乱,完全没必要同时用多个分隔符拆分后硬编码取数。
修复方案
换一种更可靠的思路:先判断加法场景,再直接从整个句子中提取所有数字,最后求和。具体调整如下:
- 简化加法场景判断逻辑,用数组存储关键词,更易维护。
- 用正则表达式匹配句子中所有数字,无需拆分字符串,彻底避免数组越界。
- 移除不必要的抽象类、未使用的变量,规范代码命名。
修复后的代码
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MathProblemSolver { static Scanner scanner = new Scanner(System.in); public static void solveAdditionProblem() { String question = scanner.nextLine(); // 加法场景关键词集合 String[] addKeywords = {"together", "sum", "more", "plus", "altogether"}; boolean isAddition = false; for (String keyword : addKeywords) { if (question.contains(keyword)) { isAddition = true; break; } } if (isAddition) { // 正则匹配所有数字 Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(question); int total = 0; while (matcher.find()) { total += Integer.parseInt(matcher.group()); } System.out.println("Total apples: " + total); } else { System.out.println("Not an addition problem."); } } public static void main(String[] args) { System.out.println("Enter your math problem:"); solveAdditionProblem(); // 若要用预设问题,替换上面两行: // String presetQuestion = "if ben has 3 apples and bee has 4 apples how many apples do they have all together?"; // question = presetQuestion; // solveAdditionProblem(); } }
代码说明
- 加法判断:遍历关键词数组,只要句子包含任意一个关键词就判定为加法场景。
- 数字提取:用
\\d+正则匹配所有连续数字,彻底规避拆分字符串带来的数组越界风险。 - 求和逻辑:遍历所有匹配到的数字,累加得到最终结果。
- 代码规范:移除了未使用的IO类、抽象类,类名改为符合Java规范的
MathProblemSolver,变量名更清晰易懂。
内容的提问来源于stack exchange,提问作者Enzo Sebastian
相关产品推荐
相关产品推荐

