36202


Javaのプログラムを勉強中で、テキストフィールドに入力した数字を取得しようとしているのですが、  
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException  
が発生してしまいます。  
他の質問サイトにて私の質問と類似した質問に対し「型があっていないため起きている」、といった指摘がなされていたのですが、エラーが発生している68行目でそのようなミスは起きていないようで困っています。デバッガで68行目にブレークポイントを設定してActionEvent型の変数eの内容を確認したところ、入力した値の情報が含まれていることが確認できました。  
なぜエラーが起きているのか、またどうすればバグをなくせるのか、ご教授願います。

[code]

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class PrintWindow extends JFrame implements ChangeListener, ActionListener{
        JSlider r1Slider, r2Slider;
        JTextField r1box, r2box;
        public static void main(String args[]){
            //タイマーIC 555の周辺部品の値を決めて出力を求める       
            PrintWindow IC555 = new PrintWindow();
            IC555.setLocationRelativeTo(null);        //画面中央にセットする
            IC555.setVisible(true);       //画面に表示する
        }
        PrintWindow(){
            int initRValue = 1;      //各値の初期値
    
            setTitle("IC555");       
            setSize(600, 400);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    
            //抵抗R1用のスライダの初期設定
            JSlider r1Slider = new JSlider(1, 1000, initRValue);     //最小値1, 最大値1000, 初期値1 
            r1Slider.addChangeListener(this);
    
            //抵抗R1の数値を表示かつ直接入力できるテキストボックス
            JTextField r1Box = new JTextField(String.valueOf(initRValue), 5);
            r1Box.addActionListener(this);  
    
            //抵抗R2用のスライダの初期設定
            JSlider r2Slider = new JSlider(1, 1000, 1);     //最小値1, 最大値1000, 初期値1
    
    
            //抵抗R1の数値を表示かつ直接入力できるテキストボックス
            JTextField r2Box = new JTextField(String.valueOf(initRValue), 5);
            r2Box.addActionListener(this);
    
            //スライダを表示するパネル
            JPanel SlidersPanel = new JPanel();   
            SlidersPanel.add(r1Slider);
            SlidersPanel.add(r2Slider);
    
            //テキストボックスを表示するパネル
            JPanel BoxPanel = new JPanel();
            BoxPanel.add(r1Box);
            BoxPanel.add(r2Box);
    
    
            //各パネルを配置
    
            getContentPane().add(BoxPanel, BorderLayout.SOUTH); 
            getContentPane().add(SlidersPanel, BorderLayout.BEFORE_FIRST_LINE);       
        }
    
        //抵抗の値を入力するスライダが移動されたときに呼び出される
        public void stateChanged(ChangeEvent e){
            //抵抗R1のスライダが移動されたとき、R1のボックスの内容をスライダの値と一致させる
            if(e.getSource() == r1Slider){
                r1box.setText(Integer.toString(r1Slider.getValue()));
            }
        }
    
        //抵抗の値を入力するボックスの内容が変更されたとき(Enterが押されたとき)呼び出される
        public void actionPerformed(ActionEvent e){
            //System.out.println("[DEBUG] actionPerformed function arrived");
            System.out.println(r1box.getText());
            //System.out.println("[DEBUG] r1 =" + r1box.getText() + "r2 =" + r2box.getText());
            /*r1Slider.setValue(Integer.valueOf(r1box.getText()));   
            r2Slider.setValue(Integer.valueOf(r2box.getText()));*/
        } 
    }
    
[/code]


CC BY-SA 3.0
2017-07-08T13:50:04.603
36200
2017-07-08T14:39:16.187
2017-07-08T13:59:42.057
5044
21185
question
java
getText部分でAWT-EventQueue-0が発生する


コンストラクタ中、

  * `JSlider r1Slider = new JSlider(1, 1000, initRValue);`
  * `JTextField r1Box = new JTextField(String.valueOf(initRValue), 5);`
  * `JSlider r2Slider = new JSlider(1, 1000, 1);`
  * `JTextField r2Box = new JTextField(String.valueOf(initRValue), 5);`

これら4行の先頭の型名を削除して、それぞれ

  * `r1Slider = new JSlider(1, 1000, initRValue);`
  * `r1Box = new JTextField(String.valueOf(initRValue), 5);`
  * `r2Slider = new JSlider(1, 1000, 1);`
  * `r2Box = new JTextField(String.valueOf(initRValue), 5);`

でいかがでしょうか?

理由は、例えば、

[code]

        JTextField r1Box = new JTextField(String.valueOf(initRValue), 5);
    
[/code]

に関して言えば、この行でこのメソッド内の新たな変数が宣言されており、  
メンバフィールド `r1Box` とは違う(同じ名前の)新たな変数になってしまっています。  
そのため、メンバフィールドの `r1Box` には値が代入されていません。  
`r1Box` に値が代入されず null のままなので、68行目の

[code]

        System.out.println(r1box.getText());
    
[/code]

の `r1box.getText()` はメソッドが呼び出せず NullPointerException になります。


CC BY-SA 3.0
2017-07-08T14:39:16.187
36202
2017-07-08T14:39:16.187
5288
36200
answer