为何数组总是索引越界?二维数组平均值计算报错排查
问题分析与修复
索引越界的直接原因
你代码最后一行的ave[r]/=(R*C)会触发数组索引越界异常,因为前面的for(r=0; r<R; r++)循环结束后,变量r的值等于R(也就是4),而ave数组的长度是4,合法索引范围是0-3,访问ave[4]自然会报错。
逻辑错误梳理
你原本想计算所有元素的平均值,但当前代码里的ave数组逻辑完全错误:
- 输入循环里
ave[r]+=sum[r]是在每个generator的每个输入项都累加一次该generator的当前总和,这会导致ave[r]的值远大于实际的全局总和。 - 用一维数组
ave来存全局平均值完全没必要,全局平均值是一个单一数值,用一个变量即可。
修复后的代码
import java.util.Scanner; public class Arrays2D_GeneratorRevised { public static void main(String[] args) { Scanner in = new Scanner(System.in); final int R=4, C=3; int r,c; double[][] volt = new double[R][C]; double[] sum = new double[R]; double totalSum = 0; // 用单个变量存所有元素的总和 System.out.println("Enter the output voltages for the following generators :"); for(r=0; r<R; r++) { System.out.print("Generator "+(r+1)+" :\n"); for(c=0; c<C; c++) { volt[r][c] = in.nextDouble(); // 改用nextDouble()匹配double类型 sum[r] += volt[r][c]; totalSum += volt[r][c]; // 累加全局总和 } } //display table System.out.print("\n\t Generator Test Results"); System.out.printf("\n\t%16s%10s%9s%10s","Output 1","Output 2","Output 3","Average"); for(r=0; r<R; r++) { System.out.print("\nGenerator "+(r+1)); for(c=0; c<C; c++) { System.out.printf("%10.2f",volt[r][c]); } System.out.printf("%10.2f",sum[r]/C); // 输出每个generator的平均值 } // 输出所有元素的全局平均值,放在表格最后一行 System.out.print("\n\tAll Generators"); System.out.printf("%30.2f", totalSum/(R*C)); System.out.print("\n\n"); in.close(); // 关闭Scanner资源 } }
关键修改点
- 移除了多余的
ave数组,改用totalSum变量存储所有元素的总和,逻辑更清晰。 - 输入时改用
nextDouble()读取数值,避免int转double的潜在问题。 - 全局平均值的输出调整到表格最后一行,格式更合理,同时避免了索引越界问题。
- 添加了
in.close()关闭Scanner,规范资源管理。
内容的提问来源于stack exchange,提问作者Johann
相关产品推荐
相关产品推荐

