2013-10-16 72 views
-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) {} 

}

+2

这是53行吗?你使用过调试器来检查变量的值吗? –

+0

你可以发布周围的行:'BingoHelper.java:53'? –

+0

对不起:这是第53行 \t \t outStream.write(nameToWrite.getBytes()); – JavaScrub

回答

1

更改你的帮手代码到下面来获取你要找的东西。我所做的更改是,

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

非常感谢你的工作!谢谢! 我听说过try和catch方法,我只是不知道它做了什么或者甚至是什么异常:/你能评论代码来帮助我吗?或者甚至更好地提供一个网站来解释什么是异常以及try和catch方法(对于初学者)。 – JavaScrub

+0

这可能有助于您理解异常处理。 http://tutorials.jenkov.com/java-exception-handling/index.html –

+0

@JavaScrub:这就是为什么你应该从书中学习。它会以一致的顺序教你你需要知道什么。这将比试验和错误更有效率,IMO。 –

2

这是问题:

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

fn只有在调用actionPerformed至少一次后才会有非空值。因此,当您调用构造函数时,fn为空,因此nameToWrite为空,因此nameToWrite.getBytes()会抛出NullPointerException。你叫什么名字预计得到这一点?为什么在构造函数中写入文件?这似乎是一件很奇怪的事情。它不应该被写入以响应用户操作吗?

(顺便说一句,请不要在未指定字符集反正使用getBytes() - 和喜欢OutputStream围绕创建一个OutputStreamWriter,而不是执行文本到二进制转换自己,要么finally块关闭流,或。试用资源声明)。

+0

我在Java的翻牌,所以我只是在学习“新部件”,并探索 我试图使用outputstream下执行的动作,但它不会让我抛出IOException ...我是如此愚蠢我应该得到一本书> _ <仍然需要帮助如何修复XD – JavaScrub

+0

@JavaScrub:试图通过实验学习一门语言并不是一个非常富有成效的方法。我一定会得到一本书。至于解决这个问题 - 我认为你需要退后一步,考虑什么时候你想写出这个文件,以及什么内容。 –

+0

我有一个我使用的按钮,该按钮在输入框中弹出一个按钮。我希望将输入框中输入的名称保存到我制作的文件中。我试图从actionlistener中写入文件,但显然没有抛出异常。我真的被困在如何让这个工作:l – JavaScrub

0

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

您确实想从构造函数中编写文件吗?

+0

不,我有一个我使用的按钮,那个按钮弹出一个输入框。我希望将输入框中输入的名称保存到我制作的文件中。我试图从actionlistener中写入文件,但显然没有抛出异常。我真的被困在如何得到这个工作上:l – JavaScrub