这两者之间的区别

时间:2014-09-20 15:25:25

标签: 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(System.in));
      String s;
      while (!(s = r.readLine()).startsWith("42"))
         System.out.println(s);
   }
}

但是Spoj不接受这个

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

    }

}

这是问题http://www.spoj.com/problems/TEST/

3 个答案:

答案 0 :(得分:1)

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

最后,两个代码都冒着读取文件的风险,而没有检查是否还有东西要读。在第一种情况下,它可以抛出NullPointerException,在第二种情况下抛出NoSuchElementException

答案 1 :(得分:0)

区别在于scan.next()是阻止呼叫 - 如果没有输入,则呼叫将等待直到有输入。

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

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

答案 2 :(得分:0)

接下来是阅读下一个令牌,也许你的意思是nextLine。

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