【问题标题】:Output Stream NullPointerException输出流 NullPointerException
【发布时间】:2013-10-16 20:34:00
【问题描述】:

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

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

}

【问题讨论】:

  • 第 53 行是哪一行?您当时是否使用调试器检查过变量的值等?
  • 你能把周围的行贴出来吗:BingoHelper.java:53
  • 对不起:这是第 53 行 outStream.write(nameToWrite.getBytes());

标签: java file-io stream output


【解决方案1】:

这就是问题所在:

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

fn 只会在至少调用一次actionPerformed 之后才会有一个非空值。所以当你调用构造函数时,fn 为空,所以nameToWrite 为空,所以nameToWrite.getBytes() 抛出一个NullPointerException。此时您希望取什么名字?为什么在构造函数期间写入文件?这似乎是一件很奇怪的事情。不应该为响应用户操作而编写吗?

(顺便说一句,不要在不指定字符集的情况下使用getBytes() - 并且更喜欢在OutputStream 周围创建OutputStreamWriter,而不是自己执行文本到二进制转换。然后关闭流finally 块,或 try-with-resources 语句。)

【讨论】:

  • 我是 Java 的失败者,所以我只是在学习“新部分”并探索我尝试在执行的操作下使用输出流,但它不会让我抛出 IOException.. . 我太笨了,我可能应该买一本书>_
  • @JavaScrub:仅仅通过实验来学习一门语言并不是一种非常有效的方法。我肯定会得到一本书。至于解决这个问题 - 我认为你需要退后一步,想想你什么时候想写出文件,以及什么内容。
  • 我有一个我使用的按钮,该按钮会在输入框中弹出一个。我希望将输入框中输入的名称保存到我制作的文件中。我尝试从 actionlistener 编写文件,但显然不会引发异常。我真的很困惑如何让它发挥作用:l
  • @JavaScrub:如果它确实抛出异常,你需要弄清楚你想要做什么。例如,您可以在动作侦听器中捕获异常。
【解决方案2】:

将您的帮助代码更改为以下内容以获得您要查找的内容。我所做的改变是,

  1. 删除了构造函数中写入文件的代码。
  2. 添加了写入文件的新方法。
  3. 从 actionPerformed 调用新方法。

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

【讨论】:

  • 非常感谢您的成功!谢谢!我听说过 try 和 catch 方法,我只是不知道它的作用或什至是什么异常:/您能否评论代码以帮助我.. 或者更好地提供一个解释什么是异常的网站和try and catch 方法的作用(对于初学者)。
  • 这可能有助于您理解异常处理。 tutorials.jenkov.com/java-exception-handling/index.html
  • @JavaScrub:这就是为什么你应该从一本书中学习。它会以连贯的顺序教你需要知道的东西。这将比试错法更多更有效率,IMO。
  • @JonSkeet 是的,你是绝对正确的,毫无疑问!明天我可能会从课堂上拿出一本书,现在就继续吧。另一方面,我正在从 newboston 频道观看显然按正确顺序排列的教程,但我的老师告诉我们期中会议即将到来,所以我需要加快步伐并启动 GUI、JFrame、ActionListeners一个在我的程序中使用 FS 的想法。
【解决方案3】:

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

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

【讨论】:

  • 不,我有一个我使用的按钮,该按钮会在输入框中弹出一个。我希望将输入框中输入的名称保存到我制作的文件中。我尝试从 actionlistener 编写文件,但显然不会引发异常。我真的很困惑如何让它发挥作用:l
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2017-06-09
相关资源
最近更新 更多