Java销售数据程序首个for循环运行时错误排查求助
我帮你梳理下代码里的问题,第一个for循环出现运行时错误的核心原因和其他逻辑问题都在这里:
1. 最直接的运行时错误:静态变量未初始化导致空指针异常(NullPointerException)
你的main方法是静态方法,直接调用了静态的calCityTotal()方法,但类里的sales、citySum这些静态变量是在**实例构造函数Sales()**里初始化的——构造函数只有创建Sales对象的时候才会执行,而你在静态方法里根本没创建过Sales实例,所以sales还是null。当calCityTotal()里执行row < sales.length时,就会抛出空指针异常,这就是第一个for循环报错的根本原因。
2. 数组索引逻辑错误(即使初始化后也会越界/计算错误)
就算解决了初始化问题,你的两个计算方法里的索引逻辑也是错的,要么会导致数组越界,要么会得到错误的计算结果:
(1)calCityTotal()的逻辑错误
citySum是用来存储每个城市的销售总额,它的长度是sales.length(对应城市数量),但你现在写的是citySum[col] += sales[row][col]——col是月份索引,逻辑完全错了:应该累加每一行(每个城市)的所有列(月份),所以正确的写法是citySum[row] += sales[row][col]。
(2)calMonthlyTotal()的逻辑错误
monthlySum是存储每个月份的销售总额,长度是sales[0].length(对应6个月份),但你写的是monthlySum[row] += sales[row][col]——row是城市索引,逻辑完全颠倒了:应该累加每一列(每个月份)的所有行(城市),所以正确写法是monthlySum[col] += sales[row][col]。
3. 修正后的完整代码
下面是修复了所有问题的代码:
public class Sales { private static String[] months; private static String[] cities; private static int[] citySum; private static int[] monthlySum; private static int[][] sales; /** * @param args the command line arguments */ public static void main(String[] args) { // 先初始化静态变量,解决空指针问题 initStaticData(); calCityTotal(); calMonthlyTotal(); displayTable(); } // 用静态初始化方法替代实例构造,适配静态main方法的调用逻辑 private static void initStaticData() { months = new String[] {"January","February","March","April", "May","June"}; // 原cities里的"NanaimoSurrey"看起来是拼写错误,帮你拆成两个城市,需要的话可以改回去 cities = new String[] {"Chilliwack","Kamloops","Kelowna", "Nanaimo","Surrey","Vancouver","Victoria"}; sales = new int[][] {{400,500,500,600,500,600}, {600,800,800,800,900,900}, {700,700,700,900,900,1000}, {500,600,700,800,700,700}, {900,900,900,1000,1100,1100}}; citySum = new int[sales.length]; monthlySum = new int[sales[0].length]; } public static void calCityTotal() { // 把row、col改成方法内局部变量,避免静态成员变量的状态混乱 for (int row = 0; row < sales.length; row++){ for (int col = 0; col < sales[0].length; col++){ citySum[row] += sales[row][col]; } } } public static void calMonthlyTotal() { for (int row = 0; row < sales.length; row++){ for (int col = 0; col < sales[0].length; col++){ monthlySum[col] += sales[row][col]; } } } // 补充实现displayTable方法,原代码缺失会编译报错 public static void displayTable() { // 打印月份表头 System.out.print("\t"); for (String month : months) { System.out.print(month + "\t"); } System.out.println("City Total"); // 打印每个城市的销售数据和总额 for (int i = 0; i < cities.length && i < sales.length; i++) { System.out.print(cities[i] + "\t"); for (int sale : sales[i]) { System.out.print(sale + "\t"); } System.out.println(citySum[i]); } // 打印每月销售总额 System.out.print("Monthly Total\t"); for (int sum : monthlySum) { System.out.print(sum + "\t"); } System.out.println(); } }
额外说明
- 我把初始化逻辑改成了静态方法
initStaticData(),这样静态的main方法可以直接调用,彻底解决了空指针问题; - 把
row和col改成了方法内的局部变量,避免使用静态成员变量带来的状态混乱问题; - 补充了
displayTable()方法的实现,不然原代码编译会报错; - 修正了
cities数组里的疑似拼写错误,如果是你故意写的可以改回原内容。
内容的提问来源于stack exchange,提问作者Jordan

