1

ボタンの1つを押したときに「ボタンを押しました」というテキストを表示しようとしています。
を取得していNullPointerExceptionます。クラスのコンストラクター内でボタンを初期化し、初期化後に から次のメソッドを呼び出しましたmain()

コードは次のとおりです。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class ButtonDemo implements ActionListener{
    JLabel jlab;

    ButtonDemo(){
        JFrame jfrm = new JFrame("A Button Example");

        jfrm.setLayout(new FlowLayout());

        jfrm.setSize(220, 90);
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton jbtnUp = new JButton("Up");
        JButton jbtnDown = new JButton("Down");

        jbtnUp.addActionListener(this);
        jbtnDown.addActionListener(this);

        jfrm.add(jbtnUp);
        jfrm.add(jbtnDown);

        JLabel jlab = new JLabel("Press a button.");

        jfrm.add(jlab);
        jfrm.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if(ae.getActionCommand().equals("Up"))
            jlab.setText("You pressed Up.");
        else
            jlab.setText("You pressed Down.");
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ButtonDemo();
            }
        });
    }
}

この例外の理由は何ですか?どうすれば解決できますか?
よろしく。

4

2 に答える 2

3

あなたのコードは、コンストラクターで変数 jlab を再宣言し、クラス フィールドを null のままにしてシャドーイングしています。そうしないと、NPE がなくなります。

つまり、次のように変更します。

ButtonDemo(){
    JFrame jfrm = new JFrame("A Button Example");

    // ...

    // the variable below is being re-declared in the constructor and is thus
    // local to the constructor. It doesn't exist outside this block.
    JLabel jlab = new JLabel("Press a button.");

    // ...
}

これに:

ButtonDemo(){
    JFrame jfrm = new JFrame("A Button Example");

    // ...

    jlab = new JLabel("Press a button."); // note the difference!

    // ...
}

NPE を解決するための鍵は、その行で使用されている 1 つの変数が null であるため、例外をスローしている行を注意深く調べることです。それがわかっている場合は、通常、残りのコードを調べて問題を見つけて解決できます。

于 2013-01-27T19:05:54.277 に答える
1

actionPerformedメソッドのjlabは、コンストラクターButtonDemoの外部で宣言したJLabelを参照します。これは、初期化しない限りnullになります(つまり、jlab = new JLabel())。したがって、例外が発生します。

于 2013-01-27T19:14:50.563 に答える