【问题标题】:How do I stop the next println from appearing before my scanner has received input?如何在我的扫描仪接收到输入之前阻止下一个 println 出现?
【发布时间】:2013-11-12 17:23:03
【问题描述】:

我正在构建一个程序,向用户询问有关房屋(编号、街道等)的一些问题,然后我将这些输入分配给字符串和整数。现在我的问题是我想问 7/8 个问题,但我希望下一个问题只有在用户为上一个问题提供输入后才会出现。部分代码如下:

        int choice = sc.nextInt();
        sc.useDelimiter("\\n");

        switch(choice){

        case 1:
            System.out.println("Geef antwoord op onderstaande vragen  en druk op ENTER na elk antwoord: ");
            System.out.println();
            System.out.println("Is de koopwoning TE KOOP of VERKOCHT? Voer een van die twee opties in: ");
            System.out.println("Voer de straatnaam van de woning in: ");
            System.out.println("Voer het huisnummer in: ");
            System.out.println("Voer de postcode in: ");
            System.out.println("Voer de plaats in: ");
            System.out.println("Voer het aantal kamers in: ");
            System.out.println("Voer de vraagprijs/koopprijs in: ");
            System.out.println("Voer het energiepeil in: ");

            String kwstate = sc.next();
            String kwstr = sc.next();
            String kwnr = sc.next(); Integer.parseInt(kwnr);
            String kwpc = sc.next();
            String kwpl = sc.next();
            int kwkamers = sc.nextInt();
            int kwprijs = sc.nextInt();
            String energie = sc.next();

如何使用此代码执行此操作?当我运行它时,它显然会显示所有问题,最重要的是,当我键入时,输入不会出现在问题旁边,而是在所有问题下方。 println 对此负责,但仅使用 print 会将所有问题彼此相邻地放在命令窗口的一行中。希望我说得通。有什么想法吗?

【问题讨论】:

  • 您可以将while 与问题和答案的数组一起使用。
  • 如果您将请求用户输入的代码放在打印问题的代码下方,您可能会期望它也会按此顺序发生! (请注意,这包含解决方案的提示)

标签: java java.util.scanner


【解决方案1】:

将每个“扫描”语句直接放在您要回答的问题之后,如下所示:

System.out.println("Is de koopwoning TE KOOP of VERKOCHT? Voer een van die twee opties in: ");
String kwstate = sc.next();
System.out.println("Voer de straatnaam van de woning in: ");
String kwstr = sc.next();
System.out.println("Voer het huisnummer in: ");
String kwnr = sc.next(); 
//...

附带说明,您没有保存Integer.parseInt(kwnr); 的结果 如果您不将结果保存到 int 值,例如 int kwnrInt = Integer.parseInt(kwnr);,则结果将丢失。

【讨论】:

  • 是的,我知道,我使用它只是为了检查用户是否实际输入了一个整数。如果没有,我在 NumberFormatException 的情况下一直有一个问题。所有的案例都在一个 try 块中。
【解决方案2】:

然后以Q&A 的形式进行。

下面的代码只是为了展示一个骨架逻辑:

System.out.print("Provide an integer here: ");
if sc.hasNextInt() {sc.nextInt()}
else {System.out.println("Didn't I tell you to enter integer???");}

【讨论】:

    【解决方案3】:

    只需将 sc.next 放在 println 语句之后。

    System.out.println("Question");
    String answer = sc.nextLine();
    System.out.println("Second Question");
    

    这样。

    【讨论】:

    • 是的,我这样做了,但似乎有问题,当我输入值 voor int kwkamers 时出现错误。它给出了 InputMisMatchException...
    • 每次更改输入时都需要创建一个新的 Scanner 类。所以对于 .nextInt() 你需要创建一个新的 Scanner 实例。我不确定为什么会这样,但是这种解决方法对我有用。有一台用于行的扫描仪和一台用于整数的扫描仪。或者,您只需 parseInt() 从 String.
    【解决方案4】:

    如果您在 Windows 上,那么这将不起作用:

    sc.useDelimiter("\\n");
    

    Windows 在每行之间使用两个字符"\\r\\n",根据我的测试,Scanner 似乎会看到"\\r",这让它感到困惑。这样效果更好:

    sc.useDelimiter("\\r?\\n");
    

    它将"\\n""\\r\\n" 视为分隔符。如果您仍然收到InputMismatchException,这可能会解决该问题。 (可能有更好的方法来表达系统相关的换行符。最好不要使用换行符作为分隔符,而是使用sc.nextLine() 来处理下一行和当前行上任何未使用的字符,或者使用其他机制。)

    【讨论】:

      猜你喜欢
      • 2017-09-23
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 2020-08-26
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多