Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6541870

NullPointerException in ObjectInputStream with Externalizables

    Details

    • Subcomponent:
    • Introduced In Version:
    • Resolved In Build:
      b17
    • CPU:
      x86
    • OS:
      windows_xp
    • Verification:
      Not verified

      Backports

        Description

        FULL PRODUCT VERSION :
        java version "1.6.0"
        Java(TM) SE Runtime Environment (build 1.6.0-b105)
        Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode)

        ADDITIONAL OS VERSION INFORMATION :
        Windows XP

        A DESCRIPTION OF THE PROBLEM :
        ObjectInputStream throws a NullPointerException when deserializing an ArrayList of Externalizables if there is an IOException while deserializing one of these Externalizables.

        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        Run the test case class.

        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        ois.readObject(); throws an IOException
        ACTUAL -
        ois.readObject(); throws a NullPointerException
        java.lang.NullPointerException
                at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1820)
                at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
                at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
                at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
                at NPEProvoker.main(NPEProvoker.java:28)

        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
        import java.io.ByteArrayInputStream;
        import java.io.ByteArrayOutputStream;
        import java.io.IOException;
        import java.io.ObjectInput;
        import java.io.ObjectInputStream;
        import java.io.ObjectOutput;
        import java.io.ObjectOutputStream;
        import java.util.ArrayList;

        public class NPEProvoker implements java.io.Externalizable {

            public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
                throw new IOException(); //io exception for whatever reason
            }

            public void writeExternal(ObjectOutput out) throws IOException {
            }
            
            public static void main(String[] args){
                try {
                    ArrayList<NPEProvoker> list = new ArrayList<NPEProvoker>();
                    list.add(new NPEProvoker());
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(baos);
                    oos.writeObject(list);

                    ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
                    ois.readObject();
                } catch (IOException e) {
                    //expected result
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (NullPointerException e){
                    //this happens
                    e.printStackTrace();
                }
            }

        }
        ---------- END SOURCE ----------

        CUSTOMER SUBMITTED WORKAROUND :
        No workaround, but I guess the following could fix the problem:

        Wrap the content of
        private void ObjectInputStream.readExternalData(Externalizable obj, ObjectStreamClass desc)
        with a try-catch block and execute
        curContext = oldContext;
        in a finally block in order to restore the old context of the stream even though an exception happened.

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  aozerov Andrey Ozerov
                  Reporter:
                  ndcosta Nelson Dcosta (Inactive)
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  0 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved:
                    Imported:
                    Indexed: