2014-11-08 159 views
0

我可以在创建后立即写入随机访问文件,但只要我尝试从我的函数写入,就会中断。写入RandomAccessFile时出现NullPointerException

private void openFile() 
{ 
    JFileChooser fileChooser = new JFileChooser(); 

    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
    int result = fileChooser.showSaveDialog(this); 

    // user clicked Cancel button on dialog 
    if (result == JFileChooser.CANCEL_OPTION) 
    { 
     return; 
    } 

    File fileName = fileChooser.getSelectedFile(); 

    if (fileName == null || fileName.getName().equals("")) 
    { 
    JOptionPane.showMessageDialog(this, 
     "Invalid File Name", 
     "Invalid File Name", 
     JOptionPane.ERROR_MESSAGE); 
    } 
    else 
    { 
    // Open the file 
     try 
     { 
      RandomAccessFile output = new RandomAccessFile(fileName, "rw"); 
      createRecord(); 
     } 
     catch (IOException e) 
     { 
      JOptionPane.showMessageDialog(this, 
      "File does not exist", 
      "Invalid File Name", 
      JOptionPane.ERROR_MESSAGE); 
     }  
    } 
} 

private void createRecord() 
{ 
    String firstName = tfdFirst.getText(); 
    String lastName = tfdLast.getText(); 
    String emailAddress = tfdEmail.getText(); 
    String homeAddress = tfdAddress.getText(); 
    Long phoneNumber = new Long(tfdPhone.getText()); 
    char gender = tfdGender.getText().charAt(0); 

    System.out.println(firstName + lastName + emailAddress + homeAddress + phoneNumber + gender); 

    try 
    { 
     output.seek(0); 
     output.writeChar(gender); 
     writeString(output, lastName); 
     writeString(output, firstName); 
     writeString(output, emailAddress); 
     writeString(output, homeAddress); 
     output.writeLong(phoneNumber); 
    } 
    catch(IOException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

对不起,代码的墙,但这些是两个有问题的功能。第一个尝试在调用createRecord()之前尝试打开一个称为输出的RandomAccessFile,它试图将来自JFrame的用户输入写入文件。如果我在createRecord()的位置放置了一个简单的writeInt()函数,那么它可以正常工作,但一旦调用createRecord()就好像输出从不存在一样。

我一直在这工作几个小时无济于事,所以如果有人能帮助找到解决方案,我将非常感激。

编辑:按要求堆栈跟踪。 (警告,很长......)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at good_gals_customer_app.NewCustomerUI.createRecord(NewCustomerUI.java:298) 
at good_gals_customer_app.NewCustomerUI.openFile(NewCustomerUI.java:273) 
at good_gals_customer_app.NewCustomerUI.butCreateRecordActionPerformed(NewCustomerUI.java:186) 
at good_gals_customer_app.NewCustomerUI.access$100(NewCustomerUI.java:21) 
at good_gals_customer_app.NewCustomerUI$2.actionPerformed(NewCustomerUI.java:87) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6527) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6292) 
at java.awt.Container.processEvent(Container.java:2234) 
at java.awt.Component.dispatchEventImpl(Component.java:4883) 
at java.awt.Container.dispatchEventImpl(Container.java:2292) 
at java.awt.Component.dispatchEvent(Component.java:4705) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) 
at java.awt.Container.dispatchEventImpl(Container.java:2278) 
at java.awt.Window.dispatchEventImpl(Window.java:2739) 
at java.awt.Component.dispatchEvent(Component.java:4705) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746) 
at java.awt.EventQueue.access$400(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:697) 
at java.awt.EventQueue$3.run(EventQueue.java:691) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) 
at java.awt.EventQueue$4.run(EventQueue.java:719) 
at java.awt.EventQueue$4.run(EventQueue.java:717) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
+0

堆栈跟踪请指出,导致NPE的线 – MadProgrammer 2014-11-08 10:11:15

+0

我甚至没有看到这个代码如何编译; 'output'在'createRecord()'中没有声明' – fge 2014-11-08 10:12:25

+0

@fge出现这个问题,'output'很可能是一个实例字段 – MadProgrammer 2014-11-08 10:16:51

回答

2

你,这似乎是一个阴影问题...

你在openFile创建一个局部变量output ...

RandomAccessFile output = new RandomAccessFile(fileName, "rw"); 

但访问,这似乎是在createRecord一个实例变量...

output.seek(0); 

很可能,实例变量是null ...

通常,我会建议删除重新声明并使用实例字段,但在此,我认为您应该删除实例字段并传递引用的RandomAccessFilecreateRecord方法

你也没有管理您的资源,记住,如果你打开,你必须关闭它...

try (RandomAccessFile output = new RandomAccessFile(fileName, "rw")) 
{ 
    createRecord(output); 
} 
catch (IOException e) 
{ 
    JOptionPane.showMessageDialog(this, 
    "File does not exist", 
    "Invalid File Name", 
    JOptionPane.ERROR_MESSAGE); 
}  

看看The try-with-resources Statement更多细节

+0

谢谢!现在起作用了。另外,我打算在稍后添加关闭代码,我想确保我可以先写入。 – Clabbage 2014-11-08 10:25:31

+0

只要你知道,不关闭文件可能会导致文件不被刷新;) – MadProgrammer 2014-11-08 10:27:10

+0

好吧谢谢你提醒我:) – Clabbage 2014-11-08 10:28:10

相关问题