簡體   English   中英

接受用戶輸入時 Java 掃描儀出現奇怪錯誤

[英]Strange error with Java Scanner when taking user input

我正在開發一個包含簡單菜單系統的 Java 項目。 當代碼到達 Menu() function 中的以下行時,我遇到了一些奇怪的錯誤:

int menuInput = Integer.parseInt(scanner.nextLine()); 

我看到了人們發布的類似問題,但我似乎沒有解決這個問題。 我在下面發布了完整的 class。

package Compiler;

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        System.out.println("Copy and paste code to be compiled here, then press ENTER followed by CTRL+D:\n");

        CharStream input = CharStreams.fromStream(System.in);
        GrammarLexer lexer = new GrammarLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        GrammarParser parser = new GrammarParser(tokens);
        ParseTree tree = parser.program();
        Worker worker = new Worker(parser.getRuleNames());
        worker.visit(tree);
        Menu(worker);
    }

    private static void Menu(Worker worker) {
        while (true) {
            System.out.println("1-4?");

            Scanner scanner = new Scanner(System.in);
            int menuInput = Integer.parseInt(scanner.nextLine());   // THIS IS WHERE THE CODE CRASHES

            try {
                switch(menuInput) {
                    case 1: {
                        worker.PrintParseTree();
                        break;
                    } case 2: {
                        String searchQuery = scanner.nextLine();
                        worker.SearchParseTree(searchQuery);
                        break;
                    } case 3: {
                        worker.PrintJSCode();
                        break;
                    } case 4: {
                        worker.PrintWACode();
                        break;
                    } default: {
                        System.out.println("ERROR: Invalid input, please try again...");
                        break;
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
}

這是繼續發生的錯誤。 代碼在讓用戶有機會進行任何輸入之前崩潰:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at Compiler.Main.Menu(Main.java:44)
    at Compiler.Main.main(Main.java:29)

更新:從 ANTLR 網站的情況來看,fromStream 方法將打開 System.in stream,然后將其關閉(參見網站的引用)。

給定一個包含 UTF-8 字節的已打開 InputStream,創建一個 CharStream。 在返回之前將 InputStream 的全部內容讀入結果中,然后關閉 InputStream。

任何人都可以為此提供解決方法嗎?

我認為在工作方法內部的某個地方關閉了 CharStream 輸入,它關閉了 System.in,這意味着掃描儀沒有更多的行可以讀取。

編輯:

我無權訪問 CharStream class,因此在示例中將其替換為 InputStreamReader。 以下代碼給出了與您的相同的錯誤。

//When the program starts, System.in is open.

InputStreamReader is = new InputStreamReader(System.in);
is.close(); 
// When we close the InputStreamReader, the underlying System.in is also closed.

Scanner scanner = new Scanner(System.in); 
//It successfully creates a scanner for System.in, even if it's closed.

scanner.nextLine();
//But it can't read, since the underlying stream is now closed.

我不關心System.in.close()的實例,而是input.close()這也會影響System.in input在不同的類中當然可能有不同的名稱。

暫無
暫無

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

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