【问题标题】:Why am I getting a NullPointerException when I try to read input using BufferedReader?当我尝试使用 BufferedReader 读取输入时,为什么会出现 NullPointerException?
【发布时间】:2021-04-19 02:22:13
【问题描述】:

我试图在一行中输入多个整数并将所有这些整数存储到ArrayList 中。这是我的代码:

    String[] input = new String[5]; 

    ArrayList<Integer> A=new ArrayList<>(5);

    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    
    try{
        while(br.readLine()!=null)
            input = br.readLine().split(" "); 
    }
    catch(Exception e){
        System.out.print(e);
    }
    
    System.out.println(Arrays.toString(input));

输入是这样的:

2 2 1 3 1

但是当我执行代码时,我在这一行 input = br.readLine().split(" "); 中得到一个 NullPointerException。我该如何解决这个问题?

编辑:尝试使用扫描仪接受这样的输入:

    String str="";
    Scanner s=new Scanner(System.in);

    String[] input = new String[5]; 
    ArrayList<Integer> A=new ArrayList<>(5);

    
    while(s.hasNext())
        str=s.nextLine();
    
    input=str.split(" ");
    
    System.out.println(Arrays.toString(input));  //[]

现在我的数组完全是空的!!

【问题讨论】:

  • 在调用split() 之前测试readLine() 的结果。 javadoc 解释了readLine 何时返回null
  • 在运行此代码之前您是否关闭了System.in
  • 考虑为您的读者使用 try-with-resources 语句或 using 语句,具体取决于您的用例。
  • 问题是您正在测试 readLine() 是否返回 null (eof),然后您再次调用 readlLine()。这第二个可能返回 null。你应该像if ((str = br.readLine()) != null) { ... }一样进行测试。
  • 试过@NomadMaker,错误依然存在

标签: java arraylist bufferedreader


【解决方案1】:

您有两次致电br.readLine()。虽然如果 line 为空,第一个调用将中止循环,但第二个调用仍然可以读取下一行,该行可以为空(表示文件结束)。另一个问题是第一个br.readLine() 返回的行丢失了。

正确的做法是:

String line;
while ((line = br.readLine()) != null) {
    String[] input = line.split(" ");
}

【讨论】:

  • 不起作用,input[]数组显示[null]
  • 当然要按空格分割。固定。
  • 当我按空格分割时,input[] 数组显示[]
  • 添加System.out.println(line) 以便您看到正在阅读的内容。在此处发布。
【解决方案2】:

输入数字之间应该正好有 1 个空格。此外,在运行此代码时,您不应以空格开始输入或将 2 个空格连接在一起。

【讨论】:

  • 或者您可以将拆分更改为split("\\s+"),它将拆分为一个或多个空格。
猜你喜欢
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 2019-11-16
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多