簡體   English   中英

如何使用 Scanner 方法“hasNext”作為條件退出 java 中的 while 循環?

[英]How to get out of while loop in java with Scanner method "hasNext" as condition?

我是 Java 編程的初學者,遇到了一個奇怪的問題。 下面是我的代碼,它要求用戶輸入並打印出用戶一次輸入一個單詞的內容。

問題是程序永遠不會結束,從我有限的理解來看,它似乎卡在了 while 循環中。 有人可以幫我一點嗎? 提前致謝。

import java.util.Scanner;

public class Test{
   public static void main(String args[]){
      System.out.print("Enter your sentence: ");
      Scanner sc = new Scanner (System.in);

      while (sc.hasNext() == true ) {
        String s1 = sc.next();
        System.out.println(s1);
      }

      System.out.println("The loop has been ended"); // This somehow never get printed.
   }
}

您繼續獲取新的新字符串,如果它不為空,則繼續循環。 只需在循環中插入一個控件以獲取退出字符串。

while(!s1.equals("exit") && sc.hasNext()) {
    // operate
}

如果要在循環內聲明字符串,並且如果字符串為“exit”,則不執行循環體中的操作:

while(sc.hasNext()) {
    String s1 = sc.next();
    if(s1.equals("exit")) {
        break;
    }
    //operate
}

Scanner將繼續讀取,直到找到“文件結束”條件。

當您從stdin讀取時,這將是您發送 EOF 字符(在 Unix 上通常為^d )時,或者是在文件末尾(如果您使用<樣式重定向)。

當您使用掃描儀時,如 Alnitak 所提到的,當您有 EOF 字符時,您只會得到 hasNext() 的“false”,基本上……您無法使用鍵盤輕松發送 EOF 字符,因此在這種情況下,這是很常見的具有可以發送以停止執行的特殊字符或單詞,例如:

String s1 = sc.next();
if (s1.equals("exit")) {
    break;
}

Break 會讓你擺脫困境。

您的條件是正確的(盡管您應該刪除== true )。 發生的事情是掃描器將繼續運行,直到到達輸入的末尾。 嘗試Ctrl+D ,或通過管道從文件( java myclass < input.txt )輸入輸入。

它不起作用,因為您沒有在代碼中編寫故障安全保護。 java 看到掃描器仍然可以在有輸入要收集時收集輸入,如果可能的話,雖然這是真的,但它會繼續這樣做。 進行掃描儀測試以查看某個單詞(例如 EXIT)是否正常,但您也可以讓它循環一定次數,例如十次左右。 但最有效的方法是詢問程序的用戶他們希望輸入多少個字符串,當他們輸入的字符串數量少於他們輸入的數量時,程序將執行。 一個附加的選項可能是,如果他們鍵入 EXIT,當他們看到他們需要的空間少於他們輸入的空間並且不想只用空格填充下一個單元格時。 您可以讓程序詢問他們是否要輸入更多信息,以防他們意識到需要向計算機輸入更多數據。 該程序的制作也非常簡單,因為您可以通過多種方法來實現。 隨時向我詢問這些方法,不過我已經沒有空間了。 XD

如果您不想為此使用 EOF 字符,則可以使用 StringTokenizer :

import java.util.*;
public class Test{
   public static void main(){
      Scanner sc = new Scanner (System.in);
      System.out.print("Enter your sentence: ");
      String s=sc.nextLine();
      StringTokenizer st=new StringTokenizer(s," ");//" " is the delimiter here.
      while (st.hasMoreTokens() ) {
        String s1 = st.nextToken();
        System.out.println(s1);
      }

      System.out.println("The loop has been ended");
   }
}

我遇到了同樣的問題,我通過使用一個掃描儀對象從控制台讀取整行,然后使用第二個掃描儀對象解析結果字符串來解決它。

Scanner console = new Scanner(System.in);
System.out.println("Enter input here:");
String inputLine = console.nextLine();

Scanner input = new Scanner(inputLine);
List<String> arg = new ArrayList<>();

while (input.hasNext()) {
    arg.add(input.next().toLowerCase());
}

您可以簡單地使用依賴於系統的文件結束指示符之一(對於 Unix/Linux/Ubuntu 為 d,對於 Windows 為 z)使 while 語句為假。 這應該能讓你很好地擺脫困境。 :)

修改while循環如下。 將 s1 聲明為字符串 s1; 一次在循環之外。 要結束循環,只需使用 ctrl+z。

  while (sc.hasNext())
  {    
    s1 = sc.next();
    System.out.println(s1);
    System.out.print("Enter your sentence: ");
  }

暫無
暫無

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

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