2016-03-20 5 views
1

Ich verwende eine Schleife, um Eingaben zu akzeptieren. Seltsamerweise scheint mein Programm zu denken, ich hätte ein Nullzeichen, wenn mein Puffer leer sein soll. Ich habe eine kleine Klasse geschrieben, um das zu demonstrieren.Null-Zeichen-Persistenz im Java-Eingabepuffer?

NullCharTest:

package Scratch; 

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

public class NullCharTest { 

    public void testNullChar() throws IOException{ 

     for (int i = 0; i < 2; i++){ 

      String s = readString(); 
      while (s != null) { 
       s = readString(); 
      } 
      System.out.println(s); 
     } 
    } 

    private String readString() throws IOException { 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     return in.readLine(); 
    } 

} 

Main:

package Scratch; 

import java.io.IOException; 

public class Main { 

    public static void main(String[] args) throws IOException{ 
     NullCharTest nct = new NullCharTest(); 
     nct.testNullChar(); 
    } 

} 

Der Ausgang ist so etwas wie:

q w e null null [[bearbeiten: die Ausgabe ist einfach null, nu ll, wie von Andreas darauf hingewiesen.]]

Ich gebe nach Eingabe von 'e' Strg + D ein.

Warum empfängt die for-Schleife den Eingang nicht beim zweiten Mal? s ist nicht null beim zweiten Mal - es ist eine frische String-Referenz, die gerade aufgefordert wurde, auf eine readString() -Ausgabe zu verweisen ... also sollte mein Programm vermutlich auf Benutzereingaben beim zweiten Durchlauf der for-Schleife warten ...

Danke!

Antwort

0

Dieser Code ist bedeutungslos:

String s = readString(); 
while (s != null) { 
    s = readString(); 
} 

Durch die Zeit, die while Schleife endet, swird null sein, denn das ist der einzige Weg für die Schleife normal abgeschlossen ist.

Sie drucken dann den Wert s, d. H. Sie drucken den Wert null.

Dies wird durch eine for Schleife umgeben, die 2-mal iteriert, was bedeutet, dass es immer Ende null zweimal bis zu drucken.

Die q w e wird nicht ausgegeben, aber die Eingabe, die Sie eingegeben haben. Der Ausgang ist null und null. Immer, unabhängig davon, was Sie eingeben, bevor Sie Ctrl+D drücken.

+0

Warum das nicht für in-Eingang nimmt Schleife zum zweiten Mal läuft es? s ist nicht null das zweite Mal herum - es wurde nur gebeten, eine readString() zu tun, also vermutlich sollte es um Benutzereingaben warten ... (Frage als Bearbeitung hinzugefügt) –

+0

@Learning ... Weil, wenn Sie Drücken Sie 'Strg + D', Sie beenden alle Eingaben. Sie schließen grundsätzlich 'System.in'. – Andreas

0

Ändern es unten wie:

String s = readString(); 
while (s != null) { 
    System.out.println(s); 
    s = readString(); 
} 
Verwandte Themen