1

作成した JFrame を実行するプログラムを作成していますが、コード内の特定のメソッドを呼び出す際にいくつかの問題が発生しています。評価に基づいて何かを出力するメソッドを実行している問題は、同じ場所で nullpointers を取得し続けます。

    JButton btnDealCards = new JButton("Deal Cards");
    btnDealCards.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            displayYourHand.setText("");
            output = "";
            couples = 0;
            for (int i = 0; i < hand.length; i++) {
                Card1 dealt = dealHand();
                if (dealt != null) {
                    hand[i] = dealt;
                    displayYourHand.setText(displayYourHand.getText()
                            + hand[i].toString() + "\n");
                } else {
                    displayYourHand.setText("NOT ENOUGH CARDS TO DEAL");
                    status.setText("Shuffle cards to continue");
                    return;
                }
            }
            // totalHand();
            // pairs();
            // twoPair();
            // threeOfAKind();
        }
    });
    btnDealCards.setBounds(336, 192, 98, 26);
    contentPane.add(btnDealCards);

    JButton btnShuffleCards = new JButton("Shuffle Cards");
    btnShuffleCards.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            shuffle();
            displayYourHand.setText("The Deck Has Been Shuffled");
        }
    });
    btnShuffleCards.setBounds(314, 229, 147, 23);
    contentPane.add(btnShuffleCards);

}

public void shuffle() {

    for (int first = 0; first < deck.length; first++) {
        int second = randomNumbers.nextInt(52);
        Card1 temp = deck[first];
        deck[first] = deck[second];
        deck[second] = temp;
    }
    btnDealCards.setEnabled(true);
}

public Card1 dealHand() {
    if (currentCard < deck.length)
        return deck[currentCard++];
    else {
        btnDealCards.setEnabled(false);
        return null;
    }
}

    public void pairs() {
    for (int k = 0; k < faces.length; k++)

        if (numbers[k] == 2) {
            output += "" + ("Pair of " + faces[k] + "'s ");
            couples++;
        }
    status.setText(output);
}

1 つ目はアクションリスナーとアクションパフォーマーで、次の 3 つは実行したいアクションで、ヌルポインターを吐き出します。問題は常に、「status.setText(output);」などの for ループの後の行です。または「btnDealCards.setEnabled(true);」。これらのステートメントを return ステートメントに変換する必要があると考えていますが、それが私の唯一の考えです。前もって感謝します!

4

1 に答える 1

1

NullPointerException (NPE) をスローしている行で逆参照されている変数は null です。たとえば、次の行で NPE を取得している場合、ステータス変数は null です。

status.setText("Shuffle cards to continue");

この行が NPE をスローする場合、displayYourHand 変数は null です。

displayYourHand.setText("The Deck Has Been Shuffled");

同様に、この行が NPE をスローする場合、btnDealCards 変数は null です。

btnDealCards.setEnabled(true);

私の賭け: オブジェクトを作成しようとするときに、コンストラクターまたは init メソッドで変数を再宣言し、クラス フィールドを null のままにして、変数をシャドウしている可能性があります。重要なのは、これらの変数を初期化していると思われるコードを見て、実際には初期化していない理由を確認することです。

于 2013-04-28T03:55:54.477 に答える