Java 这两者之间的区别

Java 这两者之间的区别,java,Java,我试图解决spoj上的问题,但我的答案是不接受给出错误的答案,我想知道这两段代码之间的区别 Spoj接受这一点 public class Test { public static void main(String[] args) throws java.lang.Exception { java.io.BufferedReader r = new java.io.BufferedReader( new java.io.InputStreamReader(

我试图解决spoj上的问题,但我的答案是不接受给出错误的答案,我想知道这两段代码之间的区别

Spoj接受这一点

public class Test {
   public static void main(String[] args) throws java.lang.Exception {
      java.io.BufferedReader r = new java.io.BufferedReader(
            new java.io.InputStreamReader(System.in));
      String s;
      while (!(s = r.readLine()).startsWith("42"))
         System.out.println(s);
   }
}
 class Test {
    public static void main(String[] args) throws java.io.IOException {
        new Test().universe();
    }

    public void universe() throws java.io.IOException {
        System.out.println("Enter Number");
        java.util.Scanner scan = new java.util.Scanner(System.in);
        String input;
        while (!(input = scan.next()).startsWith("42")){
            System.out.println(input);
            }
        scan.close();

    }

}
但Spoj不接受这一点

public class Test {
   public static void main(String[] args) throws java.lang.Exception {
      java.io.BufferedReader r = new java.io.BufferedReader(
            new java.io.InputStreamReader(System.in));
      String s;
      while (!(s = r.readLine()).startsWith("42"))
         System.out.println(s);
   }
}
 class Test {
    public static void main(String[] args) throws java.io.IOException {
        new Test().universe();
    }

    public void universe() throws java.io.IOException {
        System.out.println("Enter Number");
        java.util.Scanner scan = new java.util.Scanner(System.in);
        String input;
        while (!(input = scan.next()).startsWith("42")){
            System.out.println(input);
            }
        scan.close();

    }

}

问题出在这里

第一个代码段逐行读取文件,而另一个代码段逐行读取令牌。如果每行有多个令牌,结果可能不同


最后,这两个代码都冒着读取文件而不检查是否还有要读取的内容的风险。在第一种情况下,它可能抛出一个
NullPointerException
,在第二种情况下,它抛出一个
NoTouchElementException
,区别在于
scan.next()
是一个阻塞调用-如果没有输入,调用将等待直到有输入

您需要将扫描仪的循环更改为:

while (scan.hasNext()) {
    String input = scan.next();
    if (input.startsWith("42")) {
        System.out.println(input);
    }
}

下一个是阅读下一个标记,也许你指的是下一行


另外,您正在后者中打印“输入数字”

很抱歉,我纠正了错误,将第一块代码重新格式化以便于阅读。scan.next();是不是阻塞了r.readLine()呢;两者都返回string,它们都将阻塞。从hasNext的文档中可以看出:“这个方法可能会在等待输入扫描时阻塞。”这就是我所想的。我的答案解释了这一点!什么是没有区别的是从控制台的阅读从任何其他。