【问题标题】:Alternative for an infinite loop in java while using scanner.hasNext() with scanner argument System.in在使用带有扫描仪参数 System.in 的scanner.hasNext() 时替代Java 中的无限循环
【发布时间】:2021-07-06 13:52:16
【问题描述】:

使用 System.in 和scanner.hasNext()的无限循环

在获取用户输入并将其存储在列表中时,新手(如我)通常会考虑使用 Scanner 类进行输入并使用 hasNext() 方法检查用户的下一个输入,如下所示。但经常忘记程序会不断要求用户提供输入。每次用户按下 enter 时,hasNext() 方法都会认为生成了另一个输入并继续循环(请记住,多次按下 enter 不会产生影响)。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class App {
    public static void main(String[] args) throws Exception {

        Scanner scanner = new Scanner(System.in);

        List<String> wordsList = new ArrayList<String>();

        while (scanner.hasNextLine())
            wordsList.add(scanner.nextLine()); // Keeps asking user for inputs (never ending loop)

        scanner.close();
        
        for (String word : wordsList)
            System.out.println(word);
    }
}

问。 上述过程有哪些可行的替代方案,让用户可以动态决定输入的数量,而无需在任何地方提及总输入。

【问题讨论】:

  • 你要求的结束条件是什么?我的意思是您可以简单地将循环中的条件更改为结束,例如:1)在预定义的硬编码条目数之后,2)在用户输入停止关键字(例如 quit)之后,3 ) 在用户在输入开始时给出的一些条目之后,依此类推......
  • 嗨@gthanop 我想将数据实时保存到数据库中,因为数据是字符串并且可以是任何我不知道要设置什么退出标准的东西,例如:如果退出标准对于用户是输入 TERMINATE 循环应该停止,但同时 TERMINATE 可以是用户需要保存在数据库中的条目。
  • 特殊控制字符 (EOF) 导致 hasNextLine 返回 false:stackoverflow.com/a/16206876/2711811

标签: java java.util.scanner infinite-loop system.in


【解决方案1】:

既然您要求用户可以输入任何有效的String 作为输入,那么您可以:

选项 1:

用户可以在给出之前输入他们要给出的条目数。那么你只需要循环请求的次数。例如:

import java.util.Scanner;

public class App {
    public static void main(String[] args) throws Exception {

        Scanner scanner = new Scanner(System.in);
        
        System.out.print("Enter number of entries: ");
        String[] wordsArray = new String[scanner.nextInt()];
        scanner.nextLine(); //Skip the end of the line which contains the user's number of entries.
        
        for (int i = 0; i < wordsArray.length; ++i) {
            System.out.print("Entry " + (i + 1) + ": ");
            wordsArray[i] = scanner.nextLine();
        }
        
        for (String word : wordsArray)
            System.out.println(word);
    }
}

选项 2:

如果连用户一开始都不知道他们想要多少条目,那么您可以在每个条目之后询问他们,如下所示:

import java.util.ArrayList;
import java.util.Scanner;

public class App {
    public static void main(String[] args) throws Exception {

        Scanner scanner = new Scanner(System.in);
        
        ArrayList<String> wordsList = new ArrayList<>();
        
        do {
            System.out.print("Entry " + (wordsList.size() + 1) + ": ");
            wordsList.add(scanner.nextLine());
            System.out.print("Enter an empty/blank line to insert another word, or anything else to stop and exit: ");
        }
        while (scanner.nextLine().trim().equals(""));
        
        for (String word : wordsList)
            System.out.println(word);
    }
}

我知道这个(第二个)选项对于用户每次输入是否都想退出可能有点无聊,但他们唯一要做的就是退出程序(从第二个开始)选项)是键入任何会产生非空/空白行的内容。他们只需按一个 ENTER 键即可继续输入条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多