Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations SkipVought on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Serialization problem...

Status
Not open for further replies.

sergeiY

Programmer
Feb 13, 2003
132
0
0
AU
Hi

I am trying to serialise an object to a file. It seems to be working e.g. it creates a file with lots of funny stuff inside but when I call it second time it throws an exception... Any ideas why would this happen ??

this is my code:

...

else if(source == saveBtn)
{
try
{
FileOutputStream fos = new FileOutputStream ("myobjects.txt");
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(myCanvas.drawingItems);
out.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
...

and myCanvas.drawingItems is a Vector of objects...
 
>> it throws an exception

post the exception information

-pete
 
here it is...

Exception occurred during event dispatching:
java.lang.NullPointerException
at javax.swing.plaf.basic.BasicMenuBarUI.uninstallListeners(BasicMenuBar
UI.java:145)
at javax.swing.plaf.basic.BasicMenuBarUI.uninstallUI(BasicMenuBarUI.java
:132)
at javax.swing.JComponent.compWriteObjectNotify(JComponent.java:4532)
at javax.swing.JComponent$EnableSerializationFocusListener.writeObject(J
Component.java:4522)
at java.lang.reflect.Method.invoke(Native Method)
at java.io_ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java
:1878)
at java.io_ObjectOutputStream.outputObject(ObjectOutputStream.java:1210)

at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:366)
at java.awt.AWTEventMulticaster.save(AWTEventMulticaster.java:763)
at java.awt.Component.writeObject(Component.java:4507)
at java.lang.reflect.Method.invoke(Native Method)
at java.io_ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java
:1878)
at java.io_ObjectOutputStream.outputObject(ObjectOutputStream.java:1210)

at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:366)
at java.io_ObjectOutputStream.outputArray(ObjectOutputStream.java:1098)
at java.io_ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOut
putStream.java:456)
at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:361)
at java.io_ObjectOutputStream.outputClassFields(ObjectOutputStream.java:
1841)
at java.io_ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java
:480)
at java.awt.Container.writeObject(Container.java:1766)
at java.lang.reflect.Method.invoke(Native Method)
at java.io_ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java
:1878)
at java.io_ObjectOutputStream.outputObject(ObjectOutputStream.java:1210)

at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:366)
at java.io_ObjectOutputStream.outputArray(ObjectOutputStream.java:1098)
at java.io_ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOut
putStream.java:456)
at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:361)
at java.io_ObjectOutputStream.outputClassFields(ObjectOutputStream.java:
1841)
at java.io_ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java
:480)
at java.awt.Container.writeObject(Container.java:1766)
at java.lang.reflect.Method.invoke(Native Method)
at java.io_ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java
:1878)
at java.io_ObjectOutputStream.outputObject(ObjectOutputStream.java:1210)

at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:366)
at java.io_ObjectOutputStream.outputArray(ObjectOutputStream.java:1098)
at java.io_ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOut
putStream.java:456)
at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:361)
at java.io_ObjectOutputStream.outputClassFields(ObjectOutputStream.java:
1841)
at java.io_ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java
:480)
at java.awt.Container.writeObject(Container.java:1766)
at java.lang.reflect.Method.invoke(Native Method)
at java.io_ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java
:1878)
at java.io_ObjectOutputStream.outputObject(ObjectOutputStream.java:1210)

at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:366)
at java.io_ObjectOutputStream.outputClassFields(ObjectOutputStream.java:
1841)
at java.io_ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java
:480)
at java.io_ObjectOutputStream.outputObject(ObjectOutputStream.java:1214)

at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:366)
at java.io_ObjectOutputStream.outputArray(ObjectOutputStream.java:1098)
at java.io_ObjectOutputStream.checkSubstitutableSpecialClasses(ObjectOut
putStream.java:456)
at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:361)
at java.io_ObjectOutputStream.outputClassFields(ObjectOutputStream.java:
1841)
at java.io_ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java
:480)
at java.io_ObjectOutputStream.outputObject(ObjectOutputStream.java:1214)

at java.io_ObjectOutputStream.writeObject(ObjectOutputStream.java:366)
at GameFrame$DesignToolBar$ButtonListener.actionPerformed(MainFrame4.jav
a:419)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:14
50)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Abstra
ctButton.java:1504)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:378)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:250
)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:216)
at java.awt.Component.processMouseEvent(Component.java:3717)
at java.awt.Component.processEvent(Component.java:3546)
at java.awt.Container.processEvent(Container.java:1164)
at java.awt.Component.dispatchEventImpl(Component.java:2595)
at java.awt.Container.dispatchEventImpl(Container.java:1213)
at java.awt.Component.dispatchEvent(Component.java:2499)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2451
)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2216)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2125)
at java.awt.Container.dispatchEventImpl(Container.java:1200)
at java.awt.Window.dispatchEventImpl(Window.java:912)
at java.awt.Component.dispatchEvent(Component.java:2499)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:319)
at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:10
3)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:84)
 
Please help !!!!

I can save it to file and then read back into Vector but only once ! What am I doing wrong ?? This is my updated code:

...
else if(source == saveBtn) //save all drawings to a file
{
try
{
FileOutputStream fos = new FileOutputStream ("myobjects.txt");
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(myCanvas.drawingItems);
out.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
else if(source == reloadBtn) //read drawings from a file and load them to canvas
{
try
{
FileInputStream fin = new FileInputStream ("myobjects.txt");
ObjectInputStream oin = new ObjectInputStream (fin);
Vector savedItems = (Vector)oin.readObject();
oin.close();

myCanvas.loadDesignPane(savedItems);
myCanvas.repaint();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
...
 
The exception is coming from BasicMenuBarUI.java line 145.

Which line is that?
 
For what I've understand seems that there's a NULL Object in the myCanvas.drawingItems when you execute the line:

Code:
    out.writeObject(myCanvas.drawingItems);

Looking at the exception stack the line mentioned should be the line number 419 of the file MainFrame4.java

To try if I'm correct substitute the line with these:

Code:
    System.out.println("Start Writing...");
    out.writeObject(myCanvas.drawingItems);
    System.out.println("Finished");

If I'm right the second System.out won't appear in the standard output.

HTH.


Leonardo Mattioli
Chief Program Manager
Z Forge snc -
 
yes it is coming from the

out.writeObject(myCanvas.drawingItems);

but I don't understand why? As I close file when I finish writing to it and close it when I finish reding from it...

as regards to the fact that exception coming form BasicMenuBarUI.java ... I am puzzeled as I have only one source file ... If it will help I can post it here but it's about 600 lines


 
I was saying that, IMHO, in the Vector myCanvas.drawingItems there's an element that is NULL.
If so you've to force all the Objects in the myCanvas.drawingItems to be not NULL.
You've 2 possibilities:

1. search for all NULL Object in the Vector and set them to something not NULL... something like that

Code:
for (int i=0; i<myCanvas.drawingItems.size(); i++) {
   if (myCanvas.drawingItems.elementAt(i) == NULL) {
      //set the element i to something...
   }
}

2. write a subclass of Vector and specify a different Serialization method... if you try this you can look at the Serialization tutorial in the Java Tutorial.

The first method is more simple, the second reach the best performances when the Vector has a lot of elements.

HTH.


Leonardo Mattioli
Chief Program Manager
Z Forge snc -
 
ooooh ok !

yes I see what you mean... you might be right I'll check that Vector doesn't have nulls before serializing

Thanks a lot !
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top