Java三维数组访问与计算问题求助,代码实现存疑
三维数组遍历与计算问题排查与修复
问题分析
1. 硬编码循环边界导致的遍历不完整与越界
- 外层
cst循环:初始化cst=1且无递增逻辑,加上末尾的break,仅会处理cst=1的情况,完全跳过了cst=2(第三个银行)的数据,这是你无法访问第三个数据的核心原因。 acc循环固定acc < 3,但opers[2](第三个银行)包含4个账户数组,硬编码3次循环会漏掉第4个账户;同时部分银行的账户数量不足3(比如opers[1]只有2个账户),循环3次会触发ArrayIndexOutOfBoundsException。cash循环固定cash < 3,但很多账户的交易数组长度不足3(比如opers[0][1]只有{150,-300}两个元素),循环3次会直接抛出数组越界异常,导致程序崩溃,自然无法正确计算总和。
2. 逻辑冗余与不合理的循环结构
- 中间的
for(int i = 2; i < 3; i++)循环完全多余,它仅执行一次,目的只是输出bank[2],但三维数组opers的第一维度对应银行,应该直接用cst索引关联bank数组,不需要额外循环。
修复方案
核心原则:遍历数组时永远使用数组的length属性,而非硬编码数字,这样能适配不同长度的子数组,避免越界和遍历不完整。同时优化循环结构,去掉冗余代码。
修正后的代码
package arraysProgram; public class P05 { public static void main(String[] args) { String[] bank = {"INFO", "ACCOUNT", "MONEY"}; int total; int[][][] opers = { { {100, -50, 25}, {150,-300}, {300,-90,100} }, { {90, -60, 250}, {300,20,-100} }, { {20, 50}, {300}, {20,-20,40}, {100,-200} } }; // 遍历每个银行(第一维度) for (int cst = 0; cst < opers.length; cst++) { System.out.println("BANK " + bank[cst] + ": "); // 遍历当前银行下的每个账户(第二维度) for (int acc = 0; acc < opers[cst].length; acc++) { System.out.println("Customer Account " + (acc + 1) + ": "); total = 0; // 遍历当前账户下的每笔交易(第三维度) for (int cash = 0; cash < opers[cst][acc].length; cash++) { int amount = opers[cst][acc][cash]; System.out.print(amount + " "); total += amount; } System.out.println("\nTotal Money: " + total + "\n"); } System.out.println("------------------------"); } } }
修复说明
- 用
opers.length、opers[cst].length、opers[cst][acc].length分别作为三层循环的边界,确保遍历所有存在的元素,不会越界也不会遗漏。 - 移除了冗余的
i循环,直接通过cst索引对应bank数组,逻辑更清晰。 - 将
total的初始化移到账户循环内部,确保每个账户的总和计算独立,避免累加错误。 - 调整循环起始索引为0(Java数组索引从0开始),确保第一个银行(INFO)的数据也能被遍历到;若你需求仅需从第二个银行开始,可将
cst的初始值改为1。
验证结果
修正后的代码会正确遍历所有银行、账户和交易数据,准确计算每个账户的交易总和,同时不会出现数组越界问题,完全解决你遇到的无法访问数据、计算错误的问题。
内容的提问来源于stack exchange,提问作者AlienWare
相关产品推荐
相关产品推荐

