WinFuture-Forum.de: [Java] IO.Exception stream closed - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[Java] IO.Exception stream closed


#1 Mitglied ist offline   sкavєи 

  • Gruppe: aktive Mitglieder
  • Beiträge: 6.735
  • Beigetreten: 20. Juli 04
  • Reputation: 62
  • Geschlecht:Männlich
  • Wohnort:Stralsund

geschrieben 09. November 2012 - 13:08

Hi,

ich habe bei untenstehendem Code das Problem, dass ich zwar meine Eingabe machen kann. Danach erhalte ich aber sofort die folgende Exception:

Zitat

java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162)
at java.io.BufferedInputStream.read(BufferedInputStream.java:325)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at helpers.IO.readString(IO.java:28)
at parser.Main.readNewPersonFromConsole(Main.java:23)
at parser.Main.main(Main.java:58)


Die Exception wird durch den ersten catch-Block geworfen. Ich kann mir nur nicht ganz erklären warum. An der Stelle sollte der Stream doch noch offen sein.

/**
 * Input.class
 * @author hmk
 */
	/**
	 * Einlesen eines Strings von der Console
	 * @throws IOException 
	 */
	public static String readString() {
		String s = null;
    	BufferedReader in = null;
		try {
			in = new BufferedReader(new InputStreamReader(System.in));
			s = in.readLine();
		} catch (IOException ioe) {
			// TODO Auto-generated catch block
			ioe.printStackTrace();
		} finally {
			try {
				if (in != null)
					in.close();
			} catch (IOException ioe) {
				// TODO Auto-generated catch block
				ioe.printStackTrace();
			}
		}

		return s;
	}

Der Aufruf des Codes erfolgt aus meiner main()-Methode heraus mit folgendem Code (nichts besonderes eigentlich):
System.out.print("Bitte geben Sie einen Nachnamen für die neu anzulegende Person an: ");
newPerson.setName(Input.readString());
System.out.print("Bitte geben Sie einen Vornamen für die neu anzulegende Person an: ");
newPerson.setVorname(Input.readString());
Bei der zweiten Abfrage habe ich bereits gar keine Möglichkeit mehr irgendwas einzugeben. Da wird die gleiche Exception sofort geworfen.

Den Code für die Eingabe, also die Input.class, habe ich mir zwar selbst zusammengeschrieben, aber in ähnlichen Formen schon mehrfach als "best practice" gefunden.

Irgendwelche Ideen warum das nicht so funktioniert wie ich mir das denke?

Viele Grüße,
skaven
Eingefügtes Bild
Eingefügtes Bild
0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 09. November 2012 - 15:47

Die erste Eingabe wird durchgehen. Die Exception wird allerdings erst beim zweiten Aufruf geworfen. Das Problem ist, dadurch dass du den BufferedReader geschlossen hast, wird auch der eigentliche Eingabe-Stream (System.in) geschlossen. Somit knallt es logischerweise beim zweiten Aufruf von System.in.

Und da bekannterweise viele Wege nach Rom führen, empfehle ich dir mal den einfachsten den ich kenne:
public static String readString() {
	return System.console().readLine();
} 
:)
0

#3 Mitglied ist offline   sкavєи 

  • Gruppe: aktive Mitglieder
  • Beiträge: 6.735
  • Beigetreten: 20. Juli 04
  • Reputation: 62
  • Geschlecht:Männlich
  • Wohnort:Stralsund

geschrieben 11. November 2012 - 17:07

Ahh logisch. Vielen Dank. Das hat mir weitergeholfen.

Zwar hätte ich auch lieber System.console() oder Scanner verwendet, aber mein Professor besteht leider auf BufferedReader. :(

Ich habe es jetzt so gelöst, dass ich einfach in meiner Input-Klasse den ganzen Reader-Kram statisch aufmache und am Ende meiner main()-Funktion im finally eine Input.closeStreams aufrufe, welche den ganzen Kram dann wieder zu macht, sofern er offen ist. So bleibt einfach ein BufferedReader(new InputStreamReader(System.in)) den gesamten Programmablauf erhalten, nachdem er das erste mal verwendet wurde.
Eingefügtes Bild
Eingefügtes Bild
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0