2014-09-20 86 views
0

我试图解决关于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/

+0

对于错误我很抱歉我修复了错字 – 2014-09-20 15:27:31

+0

第一块代码重新格式化以提高可读性。 – 2014-09-20 15:32:58

回答

1

的第一个片段逐行读取文件中的行,而另一个中读取令牌令牌。如果每行有多个标记,结果可能会有所不同。

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

+0

我正在从控制台读取 – 2014-09-20 15:33:52

+0

没有区别。 – Dici 2014-09-20 15:38:58

+0

好吧,那么为什么先尝试spoj作为错误的答案请解释 – 2014-09-20 15:59:54

0

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

您需要将扫描仪循环改成这样:

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

scan.next();阻止了r.readLine();都返回字符串 – 2014-09-20 16:13:29

+0

他们都会阻止。 – folkol 2014-09-20 16:14:56

+0

来自hasNext的文档:“此方法可能会在等待输入扫描时阻塞。” – folkol 2014-09-20 16:16:25

0

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

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