Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Mysterious EOF exception with readObject

The following code produces an EOFException. Why is that?

public static Info readInfoDataFromFile(Context context) {
    Info InfoData = null;
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    Object object = null;

    if (context.getFileStreamPath("InfoFile.dat").exists()) {
        try {
            fis = context.openFileInput("InfoFile.dat");
            ois = new ObjectInputStream(fis);
            Object temp;
            try {
                // here it throws EOF exception in while loop 
                while ((temp = ois.readObject()) != null) {
                    object = temp;
                }
            } catch (NullPointerException npe) {
                npe.printStackTrace();
            } catch (EOFException eof) {
                eof.printStackTrace();
            } catch (FileNotFoundException fnfe) {
                fnfe.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (ois != null) {
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

StackTrace:

03-07 14:29:01.996: WARN/System.err(13984): java.io.EOFException
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.DataInputStream.readByte(DataInputStream.java:131)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:628)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:907)
03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)03-07 14:29:01.996: WARN/System.err(13984):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217)
03-07 14:29:01.996: WARN/System.err(13984):     at 
like image 552
AZ_ Avatar asked Mar 07 '11 09:03

AZ_


4 Answers

Depends on how many objects your file contains. If it has only one object, you can deserialise in one step.

try {
    Object temp = ois.readObject();
}
catch(Exception e) {
    //handle it
}
like image 85
adarshr Avatar answered Nov 04 '22 13:11

adarshr


First of all, readObject() only returns null if you wrote null to the stream when creating it. If there is no more data in the stream, it will throw an EOFException.

If you don't expect the EOF, the reason is probably that the stream is corrupt. This can happen if you forget to close it after writing data to it.

like image 38
Aaron Digulla Avatar answered Nov 04 '22 12:11

Aaron Digulla


I had the same mysterious EOFException and it was only the path of the Object Class to send across the ObjectOutputStream to the ObjectInputStream. They must have the same path (same package name and, of course, same class name).

like image 5
Alex Avatar answered Nov 04 '22 14:11

Alex


The definition of readObject() on ObjectInputStream doesn't specify that it will return null when the end of stream is reached. Instead an exception is thrown if you attempt to read an additional object beyond the end of the file.

like image 2
AndyT Avatar answered Nov 04 '22 14:11

AndyT