![](/img/trans.png)
[英]Merge Sort in Java not working as expected. Trying to do it without a while loop
[英]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.