簡體   English   中英

當輸入不是 integer 時,為什么這段代碼會不斷循環和淹沒終端?

[英]Why does this code keep looping and flooding the terminal when the input is not an integer?

這是代碼:

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.print("Number: ");
            if (scanner.hasNextInt()) {
                System.out.println(scanner.nextInt());
                break;
            } else {
                System.out.println("Not an integer.");
            }
        }
        scanner.close();
    }

當值為 integer 時,一切正常,循環中斷,但是當輸入不是 integer 時,我一直看到這個無限淹沒終端:

Number: Not an integer.
Number: Not an integer.
Number: Not an integer.
...
...
...

Scanner.hasNextInt()Scanner.nextInt()結合使用時發生這種情況的原因是, nextInt()方法不會消耗掃描儀緩沖區中的 ENTER 鍵擊(當您輸入數字時),因此此 ENTER 不斷獲取無限期地玩。 您需要將其從掃描儀緩沖區中清除(可以這么說),為此,您需要執行以下操作:

} else {
    System.out.println("Not an integer.");
    scanner.nextLine();  // Clear Scanner buffer.
}

我只使用Scanner.nextLine()的另一個原因;)。

哦...不要關閉掃描儀 object,除非您確定您的應用程序已完成,否則您將無法再次使用它,直到您重新啟動應用程序。 當應用程序關閉時,它會自動關閉並收集垃圾。

        if (scanner.hasNextInt()) {
            System.out.println(scanner.nextInt());
            break;
        } 

因為scanner.hasNextInt ()正在尋找Integer 輸入,如果輸入是integer,它會打印它的值並中斷( break 語句)while 循環(即退出循環),否則它會繼續掃描Z157DB7ZDF530023575E8D3666 輸入。

此外,您在 while 循環中使用條件true ,這意味着循環將繼續無限執行,直到我們中斷它。

這僅僅是因為:

  1. 你沒有取出非 integer 元素(所以它不會前進)
  2. 如果沒有 integer,則沒有其他邏輯可以離開循環( while(true)無論如何都不好)。

如果您的掃描儀 object 無法識別 integer 輸入,則您已進入無限循環。 由於 else{} 塊內沒有“中斷”,因此它將無限次循環並淹沒終端。 插入一個“break;” 在打印語句之后

添加break; 在 else 括號內的 System.out 之后,因此一旦遇到非整數輸入,您就可以中斷循環。

while(true)
{
    if(Something) // What Ever
    {
        break;
    }
}
System.out.println("Something Happened");

所以如果發生了什么事,你會看到Something Happened Once。

編輯:如果您希望它重復詢問,請按以下方式更改:

public static void main(String[] args) {
    Scanner scanner;
    while (true) {
        scanner= new Scanner(System.in);
        System.out.print("Number: ");
        if (scanner.hasNextInt()) {
            System.out.println(scanner.nextInt());
            break;
        } else {
            System.out.println("Not an integer.");
        }
    }
    scanner.close();
}

暫無
暫無

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

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