2016-03-20 12 views
1

Ich bin nicht in der Lage zu verstehen, warum ich im folgenden Code (2. Zeile der Ausgabe) null von bufferedreader bekommen, während es an einigen Stellen (erste Zeile der Ausgabe) gut funktionierte.NULL-Wert von bufferedreader

Ich habe mehrere system.out.println nur für Debugging-Zwecke verwendet.

Obwohl BufferedReader.readLine() nur dann null zurückgibt, wenn das Ende des Streams erreicht ist, wird die Eingabe bereitgestellt (wie in der Eingabe unter dem Programm angezeigt). Bitte helfen Sie mir, den Grund zu bekommen, null zu werden und eine Lösung vorzuschlagen.

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.util.*; 
import java.lang.Integer; 
import java.io.*; 

class TestClass { 
public static void main(String args[]) throws Exception { 

    //* Read input from stdin and provide input before running 
    List a2=new ArrayList(); 
    String[] a1=new String[2]; 
    int count=0; 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String line = br.readLine(); 
    /*for (String retval: line.split(" ")) 
     a2.add(retval);*/ 
    a1=line.split(" "); 
    //System.out.println("here 0"+a1[0]+" "+a1[1]); 
    /*int N = Integer.parseInt((a2.get(0)).toString()); 
    int Q= Integer.parseInt((a2.get(1)).toString());*/ 
    int N = Integer.parseInt(a1[0].toString()); 
    int Q= Integer.parseInt(a1[1].toString()); 

     System.out.println("here xxxxxxxx" + N +" " +Q); 
    String[] names=new String[N]; 
    for(int i=0;i<N;i++){ 
     //names[i] = (new BufferedReader(new InputStreamReader(System.in))).readLine(); 

     BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); 
    names[i] = br1.readLine(); 

    /*Scanner sc=new Scanner(System.in); 
    names[i]=sc.nextLine();*/ 
    } 
    System.out.println("here 111" + names[0]); 
    for(int i=0;i<Q;i++) { 
    br = new BufferedReader(new InputStreamReader(System.in)); 
    String line1 = br.readLine(); 
    try{ 
     System.out.println("here 1" + line1); 

     int M = Integer.parseInt(line1); 
     System.out.println("here 2"); 
     if(M<=20){ 
      System.out.println("here 3"); 
      count++; 
     } 
    } 
    catch(Exception e){ 
     System.out.println("here 4"); 
     if(!((Arrays.asList(names)).contains(line))){ 
      System.out.println("here 5"); 
      count++; 
     } 

    } 
    } 

    System.out.println(count); 
} 
} 

Eingangs

Erste Zeile des Eingangs wird zwei Leerzeichen getrennt ganze Zahlen bezeichnen N und Q. enthalten

nächsten N Zeilen Strings enthalten

Next Q Zeilen entweder eine ganze Zahl enthalten oder eine Zeichenfolge, die den Namen einer Person angibt. Abhängig davon, ob es sich um einen String oder einen Integer handelt, müssen unterschiedliche Logiken implementiert werden.

enter code here 

Ein- und Ausgänge sind wie folgt:.

Input: 
2 4 
pranjul 
sachin 
21 
19 
pranjul 
vipul 

Output: 
here xxxxxxxx2 4 
here 111null 
here 1null 
here 4 
here 5 
here 1null 
here 4 
here 5 
here 1null 
here 4 
here 5 
here 1null 
here 4 
here 5 
4 
+0

Der "Grund von null" ist Ende des Stromes, gerade wie Sie sagten. Sie testen nicht dafür oder behandeln es. Tun Sie dies. Hinweis: Erstellen Sie nicht jedes Mal einen neuen gepufferten Leser, wenn Sie sich in der Schleife befinden. Sie können auf diese Weise Daten verlieren. Benutze das selbe. – EJP

Antwort

1

Sie verwenden versuchen, Öffnen Sie mehr als einen Reader im selben Eingabestream.

Wenn Sie den Inhalt in Ihrem ersten br.readLine() hier lesen ist, was passiert:

  • Die BufferedReader verfügt über einen internen Puffer braucht es aufzufüllen. Es ruft die read Methode aus dem zugrunde liegenden InputStreamReader auf, um es zu füllen.
  • Die InputStreamReader, um die Bytes im Eingabestream in Zeichen zu konvertieren, verwendet StreamDecoder. So nennt es StreamDecoder 's read Methode. Intern hat es auch einen Puffer und liest so viele Bytes wie möglich aus dem zugrunde liegenden Stream in diesen Puffer.

Das heißt, sobald Sie eine Zeile lesen, lesen Sie auch mehrere Zeichen über diese Zeile hinaus. Die Standardgröße des StreamDecoder Byte-Puffers beträgt 8 KB, daher werden 8 KB von System.in gelesen, wenn sie verfügbar sind.

Wenn Sie System.in im interaktiven Modus verwenden, füllt jeder Lesevorgang den Puffer mit so vielen Bytes, wie gerade verfügbar sind. Es füllt also nur eine Zeile bis zu dem Punkt, an dem der Benutzer Enter gedrückt hat. Wenn Sie also Ihre anderen BufferedReader Instanzen öffnen, erhalten sie die nächste Eingabe, die der Benutzer eingibt.

Aber wenn System.in aus einer Datei oder einem anderen Strom umgeleitet wird, wo es nicht auf End-of-line blockiert, wird es die gesamte Datei (vorausgesetzt, die Datei kleiner als 8K) auf dem ersten Aufruf von readLine lesen . Diese Daten warten in diesem BufferedReader Puffer oder dem zugrunde liegenden Puffer StreamDecoder.

So, wenn Sie eine neue BufferedReader auf System.in öffnen, gibt es keine Daten in diesem Stream - es wurde bereits von der ersten BufferedReader gelesen. Aus diesem Grund ist es nicht empfehlenswert, mehr als einen Reader in einem einzigen Stream zu öffnen.

+0

danke @RealSkeptic. –

0

vor allem die ersten beiden Reihen nicht brauchen, wenn Sie die io * verwenden; zweitens, warum haben Sie dabei so viele Ströme, wenn 1 genug ist

import java.util.*; 
import java.lang.Integer; 
import java.io.*; 

class TestClass { 
public static void main(String args[]) throws Exception { 

List a2=new ArrayList(); 
int count=0; 
Scanner br = new Scanner(System.in); 
String line = br.nextLine(); 

String[] a1=line.split(" "); 
int N = Integer.parseInt(a1[0]); 
int Q= Integer.parseInt(a1[1]); 

    System.out.println("here xxxxxxxx" + N +" " +Q); 
String[] names=new String[N]; 
for(int i=0;i<N;i++){ 
names[i]=br.nextLine(); 
} 
System.out.println("here 111" + names[0]); 
for(int i=0;i<Q;i++) { 
String line1 = br.nextLine(); 
try{ 
    System.out.println("here 1" + line1); 

    int M = Integer.parseInt(line1); 
    System.out.println("here 2"); 
    if(M<=20){ 
     System.out.println("here 3"); 
     count++; 
    } 
} 
catch(Exception e){ 
    System.out.println("here 4"); 
    if(!((Arrays.asList(names)).contains(line))){ 
     System.out.println("here 5"); 
     count++;   } } } 
System.out.println(count); 
br.close();}} 

ich den Code testen didnt aber es sollte arbeiten, ich habe es mit Scanner, aber Sie können BufferedReader aswell

+0

Codezeilen sind keine Zeilen, und Ihre Antwort muss groß geschrieben, interpunktiert und grammatikalisch korrigiert werden. – EJP

+0

Danke. Ich habe deinen Code getestet. Es funktioniert gut. Könnten Sie mir bitte den Grund nennen, warum Bufferstream null gibt? –