@Quu23 (Kawabata kiyu)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

エラーの対処方法がわからない

解決したいこと

Java初心者です。
swingを使って入力したテキストを暗号化(と復号化)するプログラムを作ってみようと思い
実行してみたのですが、エラーが出てしまいました。
eclipseで使っているのですが、エディター上では何のエラー表記もなくどう直せばよいのか、
分からなく困っています。
どなたか教えてもらえないでしょうか。

発生している問題・エラー

Exception in thread "main" java.lang.NullPointerException
    at java.desktop/java.awt.Container.addImpl(Container.java:1117)
    at java.desktop/java.awt.Container.add(Container.java:997)
    at coder.Main.<init>(Main.java:57)
    at coder.Main.main(Main.java:24)

該当するソースコード


package coder;


import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class Main extends JFrame implements ActionListener{

     JLabel label;
     JTextField text1 = new JTextField("平文",50);
     JTextField text2 = new JTextField("暗号文",50);

    public static void main(String[] args) {

        Main fr = new Main("暗号化プログラム");//24
        fr.setVisible(true);


    }
     Main(String title){

         setTitle(title);
        setBounds(400, 100, 600, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();

        JButton button1 = new JButton("暗号化");
        button1.setActionCommand("Button 1");
        button1.addActionListener(this);

        JButton button2 = new JButton("復号化");
        button2.setActionCommand("Button 2");
        button2.addActionListener(this);

        panel.add(button1);
        panel.add(text1);
        panel2.add(button2);
        panel2.add(text2);


        Container contentPane = getContentPane();
        contentPane.add(panel, BorderLayout.NORTH);
        contentPane.add(panel2,BorderLayout.SOUTH);
        contentPane.add(panel3,BorderLayout.CENTER);
        getContentPane().add(label, BorderLayout.CENTER);//57

      }
     public void actionPerformed(ActionEvent e){
            String cmd = e.getActionCommand();

            if (cmd.equals("Button 1")){
              label.setText(Code.code(text1.getText()));//codeメゾットは入力文字列を暗号化するものです。
            }else if (cmd.equals("Button 2")){
              label.setText(Cryptanalysis.cryptanalysis(text2.getText()));//cryptanalysisメゾットは入力文字列を復号化するものです。
            }
     }
}

補足

 参考にしたサイト https://www.javadrive.jp/tutorial/

 初めてこのサイトを使ったのでマナー等が守れていなかったり、質問が下手だったりかもしれません。
 もしそういうことがありましたらすみません。

0 likes

1Answer

Mainクラスのlabelフィールドがインスタンス化(オブジェクトの生成)されていない。

getContentPane().add(label, BorderLayout.CENTER);

を実行する前に

label = new Label();

を記述して、labelフィールドに対してオブジェクトを作成してあげれれば、多分解決する。

1Like

Comments

  1. また、`Eclipse`を使っているとのことなので、早いうちからデバック実行の方法を身につけましょう。
    今回の事例であれば、57行目にブレークポイントを仕掛けて実行し、その時点での変数の状態を観察することで解決方法が見出せるようになります。
    (こればかりは場数を踏むしかない)
  2. @Quu23

    Questioner

    回答ありがとうございます。

    インスタンス化せずに実行していたから、エラーが出てしまったのですね。
    おっしゃられているとおり、早くデバックを身に付けられるようにします。

Your answer might help someone💌