You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java销售数据程序首个for循环运行时错误排查求助

排查你的Java销售总额程序运行时错误

我帮你梳理下代码里的问题,第一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:07:01