java - 这里抛出 IOException 是什么?

标签 java oop model-view-controller exception ioexception

我试图从 GUI 以及模型类中的数组列表中获取数据,然后将它们放入另一个数组列表中。每次代码运行时,它都工作正常,但是当我关闭应用程序并且序列化器代码运行时,会抛出 IOException 。

我从模型类访问的唯一内容是数组列表,但我在其他类中访问此数组列表,并且没有问题。

最初,我在模型类中添加了数组列表,我认为这就是引发异常的原因,因此我将其移至另一个类,但异常仍然被引发。

我已经尝试了表单上的其余事件处理程序,但这是唯一导致异常的事件处理程序。

以下是导致异常发生的代码:

private void btnRequestAppointmentActionPerformed(java.awt.event.ActionEvent evt) {                                                      
    ArrayList<IAccountStrategy> observers;
    observers = model.getObservers();

    IAccountStrategy xx;

    xx = observers.get(accountIndex);     

    ArrayList<Appointments> appointment;
    appointment = xx.getAppointments();     
    Appointments app = new Appointments();

    setAppointmentDates(appointment, app);
    setAppointmentPatient(appointment, app);               
    xx.getAppointments().add(app);

    JOptionPane.showMessageDialog(null, "Appointment Requested. A Secretary will check the request shortly");
}         

以及它正在调用的类:

 public void setAppointmentDates(ArrayList<Appointments> appointment, Appointments app){
    String doctorsName = null;
    String sDate;
    Date appointmentDate = null;
    Date formattedDate = null;
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

    try{
    doctorsName = cboDoctor.getSelectedItem().toString();
    sDate = cboDate.getSelectedItem().toString();

    appointmentDate = sdf.parse(sDate);
    formattedDate = sdf.parse(sdf.format(appointmentDate));
    }
    catch(ParseException ex){
        System.out.println("ParseException has been caught");
    }

    app.setAppointmentDate(appointmentDate);
    app.setPreferredDoctor(doctorsName);
}           

 public void setAppointmentPatient(ArrayList<Appointments> appointment, Appointments app){
    ArrayList<IAccountStrategy> observers;
    observers = model.getObservers();

    IAccountStrategy xx;        
    xx = observers.get(accountIndex);

    app.setPatientID(xx.getAccountID());
    app.setPatientName(xx.getFirstname() +" "+ xx.getLastname());
    app.setPatientAge(xx.getAge());
    app.setPatientSex(xx.getSex());
} 

这是我的序列化代码,它适用于我的所有其他类:

   private void formWindowClosing(java.awt.event.WindowEvent evt) {                                   
    String filename = "accounts.txt";

    try{
    FileOutputStream file = new FileOutputStream(filename);
    ObjectOutputStream out = new ObjectOutputStream(file);

    out.writeObject(model);

    out.close();
    file.close();
    }
    catch(IOException ex){
        System.out.println("IOException has been caught");
    }
}         

这是堆栈跟踪:

java.io.NotSerializableException: patientmanagementsystemv2.items.Appointments
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.ArrayList.writeObject(ArrayList.java:766)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1140)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at java.util.ArrayList.writeObject(ArrayList.java:766)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1140)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at patientmanagementsystemv2.gui.PatientHomePage.formWindowClosing(PatientHomePage.java:294)
    at patientmanagementsystemv2.gui.PatientHomePage.access$000(PatientHomePage.java:28)
    at patientmanagementsystemv2.gui.PatientHomePage$1.windowClosing(PatientHomePage.java:133)
    at java.awt.Window.processWindowEvent(Window.java:2054)
    at javax.swing.JFrame.processWindowEvent(JFrame.java:305)
    at java.awt.Window.processEvent(Window.java:2013)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2297)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
    at java.awt.EventQueue$4.run(EventQueue.java:733)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    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)                              

我试图在今晚完成这个程序,但我已经尝试解决这个问题几个小时了。感谢任何帮助。

最佳答案

堆栈跟踪

喜欢@Stultuske评论中提到,你可以在stacktrace中找到原因

寻找策略

查找包含包命名的第一个条目。根据您的情况,查找 patentmanagementsystemv2.gui

java.io.NotSerializableException: patientmanagementsystemv2.items.Appointments
    ...
    at patientmanagementsystemv2.gui.PatientHomePage.formWindowClosing(PatientHomePage.java:294)
    at patientmanagementsystemv2.gui.PatientHomePage.access$000(PatientHomePage.java:28)
    at patientmanagementsystemv2.gui.PatientHomePage$1.windowClosing(PatientHomePage.java:133)
    ...

在堆栈跟踪的顶部,您可以看到 patientmanagementsystemv2.gui.PatientHomePage.formWindowClosing(PatientHomePage.java:294) 处有一个 NotSerializedException

问题

java.io.NotSerializableException: patientmanagementsystemv2.items.Appointments

引用类型 Appointments 似乎没有实现 Serializable 并且会引发错误,因为您尝试使用 在方法 formWindowClosing 中进行序列化out.writeObject(model) 一个 Appointments 的实例。

修改约会

如果您拥有该类(class),只需写

public class Appointments implements Serializable {
    // ...
}

但是您期望出现 IOException

使用catch(IOException ex),您可以捕获IOException及其所有子类,包括NotSerializedException

关于java - 这里抛出 IOException 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54218748/

相关文章:

oop - 给(猴子)补丁还是不给(猴子)补丁,这是个问题

javascript - 在 JavaScript 中删除对象的最佳方法是什么?

c++ - 如何在QTableView中显示QAbstractItemModel的子行

Java 定义从父类(super class)返回的协变

oop - 有什么好的面向对象编程书籍可以为 OOP 打下良好、坚实的基础?

Java:Swing 的困难

javascript - AngularJS:带有查询字符串和表单的单页应用程序?

javascript - MVC架构中使用AJAX进行数据库操作

java - 使用流和 sum 方法对 BigDecimal 列表求和

java - 如何测试顺序无关紧要的生成字符串?