-1

ユーザーから文字列入力を取得してファイルに保存しようとしていますが、次のようなエラーが表示されます。問題が何であるかわかりません。実際にコードを実行するまでエラーとしてポップアップしません。 . ユーザーからの入力を、作成されたファイルに保存したいだけです

Exception in thread "main" java.lang.NullPointerException
    at BingoHelper.<init>(BingoHelper.java:53)
    at BINGO.main(BINGO.java:8)

メイン クラス コード:

import javax.swing.*;
import java.io.*;

    public class BINGO {
        public static void main(String[] args) throws IOException{
            JLabel bg = new JLabel();
            //JButton b = new JButton("Click to enter name");
            BingoHelper EnterFaze = new BingoHelper();
            EnterFaze.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            EnterFaze.setSize(500,500);
            EnterFaze.setVisible(true);
            EnterFaze.setLocationRelativeTo(null);
            EnterFaze.setLayout(null);
            EnterFaze.add(bg);
        }
    }

セカンドクラス

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

public class BingoHelper extends JFrame implements WindowListener, ActionListener{
    JTextField text = new JTextField();

JLabel bg = new JLabel();

private JButton b; {
        b = new JButton("Click to enter name");
        }

JPanel pnlButton = new JPanel();


public static String fn;
public static String sn;

public void actionPerformed (ActionEvent e) {
    //BingoHelper.fn;
    //BingoHelper.sn;
    fn = JOptionPane.showInputDialog("What is your first name?");
    sn = JOptionPane.showInputDialog("What is your second name(Optional)");
    //JOptionPane.showMessageDialog(null, "Welcome " + fn + " " + sn + ".", "", JOptionPane.INFORMATION_MESSAGE);
    text.setText("Welcome " + fn + " " + sn + ".");
    b.setVisible(false);
    text.setVisible(true);
    text.setBounds(140,0,220,20);
    text.setHorizontalAlignment(JLabel.CENTER);
    text.setEditable(false);
    text.setBackground(Color.YELLOW);
} 

public BingoHelper() throws IOException{
    super("BINGO");
    add(text);
    text.setVisible(false);
    add(b);
    this.add(pnlButton);
    pnlButton.setBackground(Color.BLUE);
    //pnlButton.add(b);+
    b.setVisible(true);
    b.setBounds(145,145,145,20);
    //b.setPreferredSize(new Dimension(150,40));
    b.addActionListener(this);
    b.setBackground(Color.GREEN);
    rootPane.setDefaultButton(b);
    File f = new File("test.txt");

    String nameToWrite = fn;
    OutputStream outStream = new FileOutputStream(f);
    outStream.write(nameToWrite.getBytes());
    outStream.close();
}

public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);

}
public void windowOpened(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}

}

4

3 に答える 3

2

これが問題です:

String nameToWrite = fn;
...
outStream.write(nameToWrite.getBytes());

fnactionPerformedが少なくとも 1 回呼び出された後にのみ、null 以外の値を持つようになります。したがって、コンストラクターを呼び出すと、fnnull になるため、nameToWritenull になるためnameToWrite.getBytes()NullPointerException. この時点で、どのような名前を期待していましたか? コンストラクター中にファイルに書き込むのはなぜですか? それは非常に奇妙なことのようです。ユーザーのアクションに応じて書かれるべきではありませんか?

(余談ですがgetBytes()、文字セットを指定せずに使用しないでください。また、テキストからバイナリへの変換を自分で実行するよりも、 のOutputStreamWriter周りにを作成することをお勧めOutputStreamします。また、finally ブロックまたは try-with-resources ステートメントでストリームを閉じます。 .)

于 2013-10-16T20:37:26.530 に答える
0

fn が null だったので、NullPointerException が発生しました。NullPointerException は Java プログラミングでは非常に一般的であるため、例外がスローされた行番号ですべての変数を調べる必要があります。NullPointerException をよりよく理解するには、http://javapapers.com/core-java/nullpointerexception-null-bad-good-and-ugly/ を参照してください

コンストラクターからファイルを書き込みますか?

于 2013-10-16T20:53:01.163 に答える