在线编译时Scanner.hasNext()返回false,但在eclipse上编译时返回true

时间:2019-07-12 13:04:15

标签: java java.util.scanner nosuchelementexception

我正在尝试解决一个竞争性编码问题,当我在eclipse或命令提示符下执行该代码时,它工作正常,但是当我将该解决方案上载到网站时,它没有执行,并在以下位置将noSuchElementException抛出:我首先接受了用户的输入。 我已经添加了导致问题的代码部分。

我尝试使用Java 8编译器版本在不同的在线编译器上执行它,但仍会引发相同的错误。 我也曾尝试使用BufferedReader,但由于某种原因,代码将k的值打印为-1。

import java.util.Scanner;

public class Solution {   
      public static void main(String[] args) {
        Scanner sc=new Scanner(System.in); 
        if(!sc.hasNext()){
            System.out.println("hasNext returns false");          
        }
        int k=sc.nextInt(); 
         System.out.println(k);
      }
}

输出:

hasNext returns false    
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at Solution.main(Solution.java:9)

3 个答案:

答案 0 :(得分:0)

这里您正在检查sc.hasNext(),它将显示“ hasNext返回false”,但是在此之后,您将再次获得nextInt(),因为在在线编译器中您无法在运行时传递参数

尝试一下

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        if(!sc.hasNext()){
            System.out.println("hasNext returns false");          
        } else {
        int k=sc.nextInt(); 
         System.out.println(k);
        }
      }

答案 1 :(得分:0)

如果您使用的是一些在线编译器,我想您只是没有标准的输入流。只需像这样模拟您的输入即可:

Scanner sc = new Scanner("42");

尽管您检查hasNext()返回的是false,但是您仍在尝试读取导致异常的下一个int。 java.util.Scanner.throwFor()上方有一个代码注释,似乎可以证实这一点:

// If we are at the end of input then NoSuchElement;
// If there is still input left then InputMismatch

答案 2 :(得分:0)

也许您应该使用静态方法,例如:

nextInt();
nextLine();
nextDouble();
nextBoolean();