输出流空指针异常



我正在尝试从用户那里获取字符串输入并将其存储在文件中,但出现错误说:我不知道问题是什么,直到我实际运行代码,它才会弹出为错误。我只想将用户的输入存储在制作的文件中

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) {}

}

这是问题所在:

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

fn只有在至少调用actionPerformed一次后才会具有非 null 值。因此,当您调用构造函数时,fn 为 null,因此 nameToWrite 为 null,因此nameToWrite.getBytes()抛出NullPointerException。此时你期望得到什么名字?为什么要在构造函数期间写入文件?这似乎是一件非常奇怪的事情。它不应该是为了响应用户操作而编写的吗?

(顺便说一句,无论如何,不要在没有指定字符集的情况下使用 getBytes() - 并且更喜欢围绕OutputStream创建OutputStreamWriter,而不是自己执行文本到二进制的转换。并使用 finally 块或资源尝试语句关闭流。

将帮助程序代码更改为以下内容以获取所需的内容。 我所做的改变是,

  1. 删除了要在构造函数中写入文件的代码。
  2. 添加了写入文件的新方法。
  3. 已从操作执行调用新方法。


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); writeToFile(); } private void writeToFile() { File f = new File("test.txt"); String nameToWrite = fn; OutputStream outStream = null; try { outStream = new FileOutputStream(f); outStream.write(nameToWrite.getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (null != outStream) { try { outStream.close(); } catch (IOException e) { // do nothing } } } } 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); } 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) { }}

你得到了一个 NullPointerException,因为 fn 是空的。NullPointerException在Java编程中非常常见,你应该在引发异常的行号中查看所有变量。为了更好地理解NullPointerException,请参阅 http://javapapers.com/core-java/nullpointerexception-null-bad-good-and-ugly/

你真的要从构造函数写入文件吗?

相关内容

  • 没有找到相关文章

最新更新