Input/Output java.io.EOFException, obwohl sie abgefangen sein sollte?

rosa`kaninchen

Neues Mitglied
Hallo zusammen 🙂

Wie ist eine EOFException möglich, wenn der Reader ausdrücklich nur so lange lesen soll, bis er am Ende der Datei ist?

Meinem Verständnis nach sollte doch durch ( while ((oo = ois.readObject()) != null)) ausgeschlossen sein, dass ein EOF-Fehler fliegt?

Hier die Methode, um die es geht:

Java:
public static void entserialisiere(String dateiname) throws IOException{
		FileInputStream fis = null;
		ObjectInputStream ois = null;
		Object oo = null;

		try	{
		  fis = new FileInputStream(new File(dateiname));
		   ois = new ObjectInputStream(fis);
		   while ((oo = ois.readObject()) != null){
			   MeinStaticHashset.schreibeDatensatz(oo);
		   };
		}
		catch (IOException e) {System.err.println(e);}
		catch (ClassNotFoundException e) {System.err.println( e );}
		finally {
			try {fis.close();} catch (Exception e) {} 
			try {ois.close();} catch (Exception e) {}
		}

Geschrieben wurde die Datei mit:

Java:
	public static void serialisiere(String dateiname, HashSet<Object> alleObjekte) throws IOException{
		FileOutputStream fos = null;
		ObjectOutputStream oos = null;
		
		try	{
			fos = new FileOutputStream(new File(dateiname));
			oos = new ObjectOutputStream(fos);
			for (Object oo: alleObjekte){
			oos.writeObject(oo);
			}
		}
		catch (IOException e) {throw e;}
		finally {
			try {fos.close(); 
			}catch(Exception e) {e.printStackTrace();} 
		}
	}


Und ich erhalte den Fehler beim Ausführen der JUnit-Tests:
Java:
	@Test
	public final void testDeserialisiere() {
		try {
			DateiEA.entserialisiere("./src/Datenbanksim");
		} catch (IOException e) {
			e.printStackTrace();
			assertNull(e);
		}
		//Debug-Ausgabe
		System.out.println(MeinStaticHashSet.simGBelegungTabelle.size());
		assertTrue(0<MeinStaticHashSet.simGBelegungTabelle.size());
}

Ich schreibe zuvor in die leere Datei zwei Objekte der Klasse A, die jeweils ein Objekt der Klassen B und C als Eigenschaft haben.
Beide Objekte Typ A werden gelesen (->geprüft durch Syso), dann fliegt die Exception. Warum?
 
Java:
java.io.EOFException
	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at technikschicht.DateiEA.entserialisiere(DateiEA.java:62)
	at technikschicht.DateiEATest.testDeserialisiere(DateiEATest.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.junit.runners.Suite.runChild(Suite.java:127)
	at org.junit.runners.Suite.runChild(Suite.java:26)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
 
schau dir doch mal die Definition der Exeption an :

EOFException :
Signals that an end of file or end of stream has been reached unexpectedly during input.

Hier wird anscheinend versucht ein byte zu lesen welches nicht existiert, bzw kein Stream mehr offen ist oder die Datei zu ende

Java:
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)

Wahrscheinlich ist der Block kleiner als die Anzahl bytes die gelesen werden sollen.

Hier ist zu sehen das du den Stream schließen musst nachdem du das Objekt eingelesen hast :

StackOverflow - EofException

schließt du den Stream nach einlesen der Objekte nicht ? Somit kann es sein das der Reader versucht weiter aus dem Datenstrom oder der Datei zu lesen , dort sind aber keine Bytes mehr vorhanden, und es fliegt die EndOfFileException
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben