簡體   English   中英

NoSuchElementException Java掃描儀*不關閉掃描儀*

[英]NoSuchElementException Java Scanner *not closing scanner*

我剛剛測試Java,並通過基本的Scanner交互遇到了此錯誤。

Value x: 
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:907)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextDouble(Scanner.java:2456)
    at HelloWorld.main(HelloWorld.java:10)

我的代碼是:

import java.util.Scanner;
import java.io.*;

public class HelloWorld{

     public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        double x;
        System.out.println("Value x: ");
        x = input.nextDouble();
        System.out.println(x);
     }
}

您需要檢查是否有一個要讀取的double精度字,最好也提取無效數據-

Scanner input = new Scanner(System.in);
double x;
System.out.println("Value x: ");
while (!input.hasNextDouble()) {
  if (!input.hasNext()) {
    System.err.println("no more input");
    System.exit(1);
  }
  System.out.println(input.next() + ": is not a double, please enter a double");
}
x = input.nextDouble();
System.out.println(x);

我不確定您提供了什么輸入來獲取此錯誤,但是我可以想象,當您通過管道將其他輸入字符串傳輸到此程序時,或者在控制台中鍵入ctrl-z時,就會發生此錯誤。

無論如何,發生的事情是您沒有向掃描儀提供輸入。

嘗試使用.hasNext()驗證輸入。

import java.util.Scanner;
import java.io.*;

public class HelloWorld{

     public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        double x;
        System.out.println("Value x: ");
        if (input.hasNext()) {
          x = input.nextDouble();
          System.out.println(x);
        } else {
          System.out.println("You didn't supply a value for x...");
        }
     }
}

在線運行相同程序時: http : //www.jdoodle.com/

我有同樣的NoSuchElementException建議下載 JDK 8並嘗試運行相同的程序。

在線編輯器的工作方式可能有所不同(在某些情況下),因此您將無法獲得理想的結果。

但是,在上面的鏈接中,如果您事先提供了stdin輸入,則可以正常工作。

在標准輸入中看起來像是一個問題。 嘗試將這條線放在掃描儀上方,以確保您可以閱讀標准輸入。 然后再次運行,輸入一些字母並檢查是否可以從標准輸入中讀取。

System.out.println((char)System.in.read());  

如果該行也給出相同的異常,則說明標准輸入存在問題。 嘗試使用默認設置重新安裝JVM。

PS:您的代碼對我來說很好

問題是沒有輸入任何內容時,掃描程序會嘗試從輸入流中獲取數字。

解決此問題的方法是等待Scanner.hasNextDouble()為true,以便在輸入后嘗試讀取輸入的數字。

while(!input.hasNextDouble()) { }

x = input.nextDouble();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM