Java JLabel数组setIcon()导致空指针异常

Java JLabel数组setIcon()导致空指针异常,java,swing,nullpointerexception,jlabel,Java,Swing,Nullpointerexception,Jlabel,我正在写一个纸牌游戏,我需要用用户选择的牌替换现有的牌。 首先,我在一个面板中显示了14张卡,该面板是一个JLabel数组,在我的GUI类中声明并初始化为: public JLabel[] cardsLabel; //as class variable cardsLabel = new JLabel[14]; //inside constructor 这些卡片显示在一个面板上,下面的代码工作正常 for (int index=0; index<cardsLabel.length; i

我正在写一个纸牌游戏,我需要用用户选择的牌替换现有的牌。 首先,我在一个面板中显示了14张卡,该面板是一个JLabel数组,在我的GUI类中声明并初始化为:

public JLabel[] cardsLabel;  //as class variable
cardsLabel = new JLabel[14];  //inside constructor
这些卡片显示在一个面板上,下面的代码工作正常

for (int index=0; index<cardsLabel.length; index++)
        {
            cardsLabel[index] = new JLabel();
            cardsLabel[index].setIcon(backOfCard);
            cardsContainer1.add(cardsLabel[index]);
            game.add(cardsContainer1, BorderLayout.EAST);       //add cards to east of game container
        }
我在使用JLabel数组时遇到空点错误。 以下是前几行错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at game.GameTableFrame.cardFlip(GameTableFrame.java:162)
at game.FishingGame.gamePlay(FishingGame.java:80)
at game.GameTableFrame.<init>(GameTableFrame.java:152)
at game.GameModule$1.actionPerformed(GameModule.java:95)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

请问,我如何在GameModule类中进行更改

public GameModule() {
        playersData = new PlayersData();    
        dealer = new Dealer();
        login = new JPanel();
        loginFrame = new JFrame();
    }
//目前,这是我如何从GameModule类调用GameTableFrame的

gameTableFrame = new GameTableFrame(dealer, player);

如果索引错误,将抛出ArrayIndexOutOfBounds。我猜cardsLabel数组在代码的其他地方被更新为null,这就是为什么在访问它时会抛出NullPointerException的原因


您可以发布GUI类的完整代码吗?

您调用了错误的构造函数

public GameTableFrame()
public GameTableFrame(Dealer dealer, Player player)
初始化是在参数化构造函数中完成的

public GameTableFrame()
public GameTableFrame(Dealer dealer, Player player)
使用参数化选项。

您必须更改:

gameTable = new GameTableFrame();   
用于:

否则,您将不会初始化卡

更新

它会冻结,因为您是交叉引用对象。所以,当你创建GameTableFrame时,它会创建一个FishingGame,这会创建另一个GameTableFrame,等等。你不能这样做。如果需要引用FishingGame,应将对象传递给GameTableFrame,如:

new GameTableFrame(dealer, player, this)
和变化:

public GameTableFrame(Dealer dealer, Player player)
用于:


你没有得到NPE。您收到ArrayIndexOutOfBoundsException,因为cardsLabel没有8项。@luanjot抱歉。。。我复制了错误的错误代码。我想你没有在正确的实例上调用cardFlip。然后,在第二个类中,cardsLabel没有初始化他的所有项,因此,当它到达其中一个为null时,抛出一个NPE。你可以发布你是如何在第二个类中检索cardsLabel的吗?cardsLabel是在哪个类构造函数中初始化的?那太过分了。我们的目标是使代码尽可能短。@Loganathan Mohanraj我的GUI类很长,可以在这里发布完整的代码:@kbear能否请您检查cardsLabel数组是否在其他地方被操纵,这导致了空指针异常?还要检查您的应用程序是否在同一个GUI实例上工作?
gameTable = new GameTableFrame();   
gameTable = new GameTableFrame(dealer, player);
new GameTableFrame(dealer, player, this)
public GameTableFrame(Dealer dealer, Player player)
public GameTableFrame(Dealer dealer, Player player, FishingGame fg)