【问题标题】:Scanner.hasNext() returns false when compiled online but true when compiled on eclipse [duplicate]Scanner.hasNext() 在线编译时返回 false,但在 eclipse 上编译时返回 true [重复]
【发布时间】:2019-07-12 13:04:15
【问题描述】:

我正在尝试解决一个竞争性编码问题,当我在 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)

【问题讨论】:

    标签: java java.util.scanner nosuchelementexception


    【解决方案1】:

    在这里,您正在检查 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);
            }
          }
    

    【讨论】:

    • 感谢您的回答,但是else部分没有执行它打印相同的消息并终止。
    • 是的,你不能在所有在线编译器中传递参数,试试下面的 URL jdoodle.com/online-java-compiler。在此处添加您的代码并在标准输入和命令行参数中传递值。它会工作
    【解决方案2】:

    如果您使用一些在线编译器,我认为您手头没有标准输入流。只需像这样模拟您的输入:

    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
    

    【讨论】:

    • 感谢您的回答,成功了。你是对的 System.in 不能在在线编译器中工作。您能否建议我如何修改代码,以便它接受在线编译器传递的输入。现在它只是在输出上打印 42
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2012-11-11
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多