-1

I am inserting a serializable object obtained from de-marshalling an xml. For inserting the object, I use the below methods namely insertPOJOInBackend(). However, while retrieving the object using the method readPOJOFromBackend(), I am getting a EOFException. I am struggling with this exception for the past week. A little help will be highly appreciated.

insertPOJOInBackend(String key, String url, Serializable Object){

   //obtained connection object

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new 
    BufferedOutputStream(connection.getOutputStream()));

    objectOutputStream.writeObject(serializableObject);
    objectOutputStream.close();

    BufferedReader rd = null;
    StringBuilder sb = null;
    String line = null;

    rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

    sb = new StringBuilder();
    while ((line = rd.readLine()) != null) {
      sb.append(line);
    }

}

readPOJOFromBackend() {

HttpsURLConnection connection = null;
    try
    {
      //obtained connection object

      ObjectInputStream objectInputStream = new ObjectInputStream(new 
      BufferedInputStream(connection.getInputStream()));

      connection.getInputStream().close();

      responseObject = objectInputStream.readObject();

      objectInputStream.close();
    }
    catch (EOFException eof)
    {
      LOG.error("EOFException");
    }
}

Am I closing the input stream too early for ObjectInputStream or please check where I am getting wrong ? Please let me know if you require any other information. I am getting EOFException while invoking objectInputStream.readObject. PFB the stacktrace.

java.io.EOFException
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2669)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3413)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:3214)
    at java.io.ObjectInputStream.readString(ObjectInputStream.java:1896)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1558)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:426)
    at java.util.ArrayList.readObject(ArrayList.java:778)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1159)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2167)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:426)
    at java.util.ArrayList.readObject(ArrayList.java:778)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1159)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2167)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2276)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2200)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2058)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:426)
    at **.**.**.common.backend.impl.BackednImpl.readPOJOFromBackend(XXXXXImpl.java:812)
user207421
  • 305,947
  • 44
  • 307
  • 483
ks55NGMC
  • 1
  • 1
  • 1
    `connection.getInputStream().close();` - you get the InputStream and instantly close it. Move it to after reading the object. – Amongalen Jun 03 '20 at 10:09
  • You have forgotten to post the sending code, which clearly has closed the connection before sending the object. – user207421 Jun 03 '20 at 10:39

1 Answers1

0

A big shout out to @Amongalen for the resolution and the swift response.

I moved the connection.getInputStream().close() after the invoking the objectInputStream.readObject() and it is working as expected.

Phew. One Full Week !!!

ks55NGMC
  • 1
  • 1