[Java] InputStreamReader unverständliche IOException

Helios co.

Lt. Commander
Registriert
März 2005
Beiträge
1.863
Hallo,

ich arbeite gerade an einem etwas größerem Projekt und komme an einer Stelle nicht mehr weiter.

Folgender code:
Code:
private Customer voteCustomer() {
		
		System.out.println("Blablabla");
		
		int readIn = -1;
		
		
		try {
			
			readIn = reader.read();
			System.out.println(readIn); //test
			
			reader.close();
			
		} catch (IOException e) {
			System.err.println("IO-Fehler in Methode voteCustomer");
			e.printStackTrace();
		} 
		
		return null;
	}

Jetzt wird folgender Fehler geworfen:

java.io.IOException: Stream closed
at java.io.BufferedReader.ensureOpen(Unknown Source)
at java.io.BufferedReader.read(Unknown Source)
at ds.TextUserInterface.voteCustomer(TextUserInterface.java:170)
at ds.TextUserInterface.getCustomer(TextUserInterface.java:149)
at ds.TextUserInterface.getCustomerFromUser(TextUserInterface.java:104)
at ds.Main.main(Main.java:30)



Der code der vorher ausgeführt wird läuft soweit einwandfrei.

Meine erste Vermutung war, dass ich irgendwo vorher einen stream nicht wieder geschlossen habe, dem war aber nicht so.

Bin dankbar für Rat.
 
Hallo

versuch mal es mal so, übergib den Reader an die voteCustomer()-Methode.

Den so wie es aussieht, ist der Reader nicht erstellt worden und es wird deshalb Reader closed ausgeben.

gruss saemu
 
Daran wird es nicht liegen. Dann käme eher eine NullPointerException.

Wahrscheinlich hast du den Stream, der sich in dem Reader befindet schon woanders in einem anderen Reader benutzt und dann einfach den Reader geclosed. Damit wird dann nämlich auch der Stream geschlossen.

edit: Ich habs mal ausprobiert. Du hast wahrscheinlich denselben Reader, nicht den Stream, woanders geschlossen.
 
Zuletzt bearbeitet:
Hallo ich bins noch mal,

@ Cobinja: Es scheint doch nicht daran zu liegen, dass ich den reader vorher geschlossen habe.

Aber in soweit hattest du recht, dass es an einer Methode liegen muss, die vorger läuft bzw. voteCustumer aufruft, denn voteCustomer läuft für sich alleine einwandfrei.

Was ich aber nicht so ganz verstehe, denn das Einzige was ich vorher mache ist mittels Iterator eine Ausgabe auf die Console (d.h. also ich lese einen Vector aus).
Danach soll (also in voteCustomer) ein Wert eingegeben werden (int), der dann mittels System.in gelesen werden soll, um dann damit weiterzuarbeiten (in einer anderen Methode).

Das einzige mal,wo ich den reader vorher benutze ist bei einem Ja-Nein Dialog...was aber lange vor dem Aufruf von voteCustumer geschieht.(und es ändert auch nichts wenn ich den reader close oder nicht)


Bin echt konfus langsam!
 
Mein Testcode gestern abend sah so aus:
Code:
package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test01 extends Thread {

  private static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

  private static void test() {
    System.out.println("Blablabla");
    int readIn = -1;
    try {
      readIn = reader.read();
      System.out.println(readIn); //test
      reader.close();
    }
    catch (IOException e) {
      System.err.println("IO-Fehler in Methode voteCustomer");
      e.printStackTrace();
    } 
  }

  public static void main(String[] args) {
    try {
      test();
      reader.read();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
Ein Durchlauf gibt folgendes:
Code:
Blablabla
f
102
java.io.IOException: Stream closed
    at java.io.BufferedReader.ensureOpen(Unknown Source)
    at java.io.BufferedReader.read(Unknown Source)
    at test.Test01.main(Test01.java:29)
Das einzelne f habe ich auf der Konsole eingegeben, die Exception wurde in der main-Methode bei "reader.read();" geschmissen. Wie man sieht, ist es exakt die Exception, die du auch bekommen hast.

Es würde helfen, wenn du mal alle Codezeilen posten könntest, die mit dem Reader zu tun haben, jeweils mit Angabe, in welcher Klasse bzw. Methode dies passiert.
 
Ich habe den Fehler jetzt gefunden, nur verstehe ich ihn nicht so ganz.
Folgende Methode ist die einzige in der der reader vor dem AUfruf in voteCustumer genutzt wird:

Code:
public Customer getCustomerFromUser(){
		
		System.out.println("Kundensuche: ");
		String customerName = "";
		
			try {
				customerName = reader.readLine();
				
		
			} catch (IOException e) {
				e.printStackTrace();
			}
		
		searchCustomer(customerName.toUpperCase());   
		
		return getCustomer();
	}

Und der Fehler ist, das der AUfruf von: searchCustomer(customerName.toUpperCase());
nicht im try Block geschieht.
Was ich aber wie gesagt nicht verstehe, denn der reader legt die Eingabe doch im String customerName ab, womit seine Arbeit erledigt wäre?!
 
Die Exception taucht genau dann auf, wenn der BufferedReader, den du benutzt, irgendwo geschlossen wurde, und zwar der BufferedReader, nicht der InputStreamReader der im BufferedReader steckt, und auch nicht der InputStream, der in dem InputStreamReader ist.

Wie hast du denn den BufferedReader erzeugt? Mit einem anonymen Reader oder mit einem, der schon als Objekt existierte? Und was für ein Reader ist das genau?
 
Den Reader erzeuge ich in derselben Klasse in der sich auch die Methode getCustomerFromUser befindet.

Wie gehabt erzeuge ich hier mittels new einen neuen BufferedReader, der als Parameter ein InputStreamReader, der wiederum System.in als Parameter hat.
Wenn ich deinen Frage richtig verstehe, müsste das Zweitere sein, sprich das der Reader als Objekt vorliegt.
Oder was genau meinst du mit "anonymer Reader" ?
 
Mit "anonymer Reader" meine ich das, was du gemacht hast, nä(h)mlich als Parameter einen "new InputStreamReader()" zu übergeben.

Ich hab gestern abend nochmal ein bischen rumexperimentiert und bin zu dem Schluss gekommen, daß die Exception, so wie sie bei dir geworfen wurde, also mit dem entsprechenden Call-Stack, nur dann vorkommt, wenn der BufferedReader geschlossen wurde.
Wenn der InputStreamReader oder der Stream selbst geschlossen werden, sehen Exception und Call-Stack anders aus.
Ist die Methode "getCustomerFromUser()" der Ja-Nein-Dialog, den du in Post #5 erwähnt hast? Wahrscheinlich nicht.
Es muss irgendwo der Reader geschlossen werden, ansonsten taucht die Exception nicht in der Form auf.
 
Nope, wie du schon vermutet hast ist getCustumeFromUser nicht der ja-nein Dialog.
Hierbei handelt es sich um eine eigene Methode, die aber auch den reader nutzt.

Aber auch in dieser Methode wurde der reader nicht explizit geschlossen.
 
Schließt du ihn vielleicht von irgendwo anders (Ein ander Thread, eine andere Klasse, ...)?

Ansonsten fällt mir dazu auch nicht mehr viel ein.
 
Habe es jetzt endlich gefunden.
Du hast recht, ich habe den reader wirklich in einer anderen Klasse geschlossen.

Jetzt funzt alles einwandfrei!!

Danke dir Cob!!
Also ich habe hier schon häufuger um Hilfe gebettelt, aber jetzt die von dir -> 1a

Nochmals thx!
 
Zurück
Oben