簡體   English   中英

雖然循環沒有按預期工作。 一切似乎都是正確的。 我該如何解決這個問題?

[英]While loop is not working as expected. Everything seems to be correct. How do I fix this problem?

所以我有這個程序:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
       
        Scanner scan = new Scanner(System.in);
        String name = "";
        while(name.isBlank()) {
            System.out.println("Enter your name: ");
            name = scan.next();     
        }
        System.out.println("Hello "+ name + "!");
    }
}

這個程序應該提示用戶輸入他們的名字。 並且它應該一直提示他們,直到他們實際輸入他們的名字,這意味着如果他們將輸入字段保持空白並按回車鍵,他們將再次收到提示。 但是,該程序不會這樣做。 即使我在沒有輸入我的名字的情況下按下 ENTER,程序也只是凍結並且不會再次提示。 請幫忙:(。

您應該使用nextLine()而不是next()來實現您想要實現的行為。

正如文檔所述:

掃描儀使用分隔符模式將其輸入分解為標記,默認情況下匹配空格。

next() :從該掃描器中查找並返回下一個完整的標記。

nextLine() :使此掃描器前進到當前行並返回跳過的輸入。

next()方法一旦遇到空格就會中斷讀取,例如:制表符 (\t)、換行符 (\n)、回車符 (\r) 或適當的空格(還有其他字符屬於空白定義)。 當您在輸入的開頭繼續鍵入一個空格或一個新行,而您的Scanner正在期待next()調用的內容時,您的Scanner實例將簡單地忽略它,因為尚未鍵入“任何內容”(除了分隔符,這不包括在返回值中)。

另一方面,當您調用nextLine()方法時,該方法返回當前行或當前行的 rest,具體取決於內部Scanner s cursor 的剩余位置,不包括末尾的任何行分隔符。 因此,每次您在nextLine()需要輸入時鍵入 enter 時,這將返回一個空String ,而不是next()方法,后者會阻塞,直到輸入了一些正確的輸入和分隔符。

這是您的代碼的調整版本:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String name = "";
    while (name.isBlank()) {
        System.out.print("Enter your name: ");
        name = scan.nextLine();
    }
    System.out.println("Hello " + name + "!");
}

在您的代碼中,您使用了next()方法來獲取用戶輸入。 實際上next()是在您不希望輸入字符串為空時使用的。 因此,如果您在輸入非空內容之前按回車鍵,則next()會期待任何非空字符串(等待非空字符串)並忽略之前輸入的所有空白字符。

對於您的情況,如果name為空,您希望在每次輸入后提示。 在這種情況下,您需要改用nextLine()方法,如果用戶按下回車鍵,它將移至下一條語句。 然后檢查 while 循環內的條件。

注意: next()只接受單個單詞,而nextLine()接受多個單詞。

正確的代碼是@Dan 在他的回答中提供的。

我想補充丹的回答。 這里的關鍵是next()的文檔指示的內容。

此方法可能會在等待輸入掃描時阻塞

問題是,這是什么意思? 這意味着 OP 的代碼按照預期的方式工作。

Enter your name: 
[ENTER pressed]
[ENTER pressed]
[ENTER pressed]
[ENTER pressed]
[ENTER pressed]
hector
Hello hector!

因為按下 ENTER 時沒有輸入,所以調用next()方法會阻塞等待輸入。 輸入輸入后,將使用掃描儀輸入並生成正確的 output。 因為該方法是阻塞的,所以不會發生循環; 從而使代碼看起來像是被凍結了,而實際上卻沒有。

暫無
暫無

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

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