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

调用其他类方法出现循环/Null错误 两类互相调用引发逻辑循环问题

问题根因

你遇到的循环报错是两个类互相主动实例化对方导致的:Home类初始化时会创建Shop实例,若Shop类内部又直接新建Home实例,就会触发无限循环的实例化流程,最终出现栈溢出或初始化异常。

解决方案

通过构造函数注入已有实例的方式实现互相调用,不要各自新建对方的实例:

1 改造Shop类,新增接收Home实例的构造方法

public class Shop {
    // 持有外部传入的Home实例,不要自己new Home
    private Home home_class;

    // 改造构造方法,接收已存在的Home实例
    public Shop(Home home) {
        this.home_class = home;
        // 以下保留你原有Shop类的初始化逻辑
        JButton[] buttons = new JButton[你需要的按钮数量];
        // 按钮添加到面板等原有逻辑
        buttons[0].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(stbl + act + "zurück button");
                setVisible(false);
                home_class.home_open();
            }
        });
    }
    // 其余Shop类原有逻辑
}

2 改造Home类中Shop实例的初始化逻辑

public class Home {
    // 初始化Shop时传入当前Home实例(this),不要直接new Shop()
    Shop shop_class = new Shop(this);
    JButton[] buttons = new JButton[4];
    //BUTTONS GET ADDET TO A PANEL THAT IS ON A FRAME

    buttons[2].addActionListener(new ActionListener() { 
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(stbl + act + "shop button");
            shop_class.setVisible(true);
            home_close();
        }
    });

    private void home_close() {
        for (int i = 0; i < buttons.length; i++) {
            buttons[i].setEnabled(false);
        }
    }

    public void home_open() {
        for (int i = 0; i < buttons.length; i++) 
            buttons[i].setEnabled(true);
    }
}

注意事项

不要在Shop的构造方法中调用Home还未初始化完成的成员,避免空指针异常。

内容的提问来源于stack exchange,提问作者user17362691

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:06:03