1

我无法理解为什么我在以下代码(输出的第二行)中从 bufferedreader 得到 null,而它在某些地方工作正常(输出的第一行)。

我已经使用了几个 system.out.println 只是为了调试目的。

尽管 BufferedReader.readLine() 仅在到达流的末尾时才返回 null,但正在提供输入(如程序下方的输入所示)。请帮助我了解获取 null 的原因并提出解决方案。

 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);
}
}

输入

输入的第一行将包含两个空格分隔的整数,表示 N 和 Q。

接下来的 N 行将包含字符串

接下来的 Q 行将包含一个整数或一个表示人名的字符串。必须根据它是aString 还是Integer 来实现不同的逻辑。

enter code here

输入和输出如下:

 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
4

2 回答 2

1

您试图在同一输入流上打开多个阅读器。

当您阅读 first 中的内容时br.readLine(),会发生以下情况:

  • BufferedReader有一个需要填充的内部缓冲区。read它从底层调用方法InputStreamReader以填充它。
  • InputStreamReader为了将输入流中的字节转换为字符,使用StreamDecoder. 所以它调用 that StreamDecoder'sread方法。在内部,它也有一个缓冲区,它会从底层流中读取尽可能多的字节到该缓冲区中。

这意味着,一旦您阅读了一行,您还将阅读该行之外的几个字符。字节缓冲区的默认大小为8K,因此如果可用StreamDecoder,它会从中读取 8K 字节。System.in

如果您System.in在交互模式下使用,则每次读取只会用当时可用的字节数填充缓冲区。所以它只填充一行到用户按下的点,Enter因此,当您打开其他BufferedReader实例时,它们将获得用户输入的下一个输入。

但是,如果System.in从一个文件或其他没有在行尾阻塞的流中重定向,它将在第一次调用时读取整个文件(假设文件小于 8K)readLine。该数据在 thatBufferedReader的缓冲区或底层StreamDecoder的缓冲区中等待。

因此,当您打开一个新BufferedReader的 onSystem.in时,该流中不再有数据 - 它已被第一个读取BufferedReader。这就是为什么不建议在单个流上打开多个阅读器的原因。

于 2016-03-20T13:03:23.010 回答
0

首先,如果您使用 io.*,则不需要前两行;其次,你为什么使用这么多流,如果 1 就足够了

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();}}

我没有测试代码,但它应该可以工作我用扫描仪做的,但你也可以使用 bufferedreader

于 2016-03-20T12:33:33.870 回答