【问题标题】:Java - if/else fails immediately when supposed to pauseJava - if/else 在应该暂停时立即失败
【发布时间】:2015-04-26 14:37:09
【问题描述】:

我在使用 java 中的函数时遇到问题。这是我的代码:

    do{
        System.out.print("Proceed to payment? (y/n) ");
        input = scan.nextLine();
        if((input.trim()).equals("y")){
            break;
        }
        else if((input.trim()).equals("n")){
            System.out.print("Come back next time, " + name + ".");
            System.exit(0);
        }
        else{
            System.out.println("Invalid response. Try again.");
        }
    }
    while(true);

基本上,函数第一次循环时会“跳过”“input = scan.nextLine”并立即打印“无效响应。再试一次”。到终端。然后它允许用户输入一些东西,并正常工作。

是的,我已经在我的代码前面声明了输入、扫描 (java.util.Scanner;) 和名称。如果有人能指出我做错了什么,那将是一个很大的帮助!谢谢!

【问题讨论】:

  • 您是否再次此输入之前使用扫描?
  • 不在同一个函数中,不过我确实在早期的函数中使用过它
  • 好的,它是scan.next()之前的那个吗?
  • 在同一功能中没有其他使用扫描。在之前调用的函数中,有一个scan.nextInt(),但我不知道它是如何影响它的。
  • 由于 scan 是一个类变量,它仍然有部分 nextInt() 输入,主要是 Scanner 缓存/缓冲区中的换行符(或 Enter

标签: java if-statement java.util.scanner


【解决方案1】:

虽然在之前添加 scan.nextLine() 确实有帮助,但我会在使用以下方法初始化 Scanner 类时保持设置分隔符的一般规则:

scan.useDelimiter("\n");

在这种情况下,它使用换行符作为分隔符。因此,对于所有的扫描方法,只要用户按下Enter,它就会被解释为输入的结束。这包括nextInt()nextDouble()next()etc...

使用分隔符也意味着我不必在每个非nextLine() 输入后添加scan.nextLine()

【讨论】:

    【解决方案2】:

    在进入do-while 循环之前,您可能调用了scan.next() 或类似的名称。这在输入中留下了下一行字符,并且对 scan.nextLine() 的调用消耗了它。要修复它,您可以在scan.next() 之后立即调用scan.nextLine(),这样它会在进入循环之前消耗下一行。

    例如:

    Scanner scan = new Scanner(System.in);
    String input;
    String name = scan.next();
    scan.nextLine();
    do {
        System.out.print("Proceed to payment? (y/n) ");
        input = scan.nextLine();
        // rest of the code
    }
    while(true);
    

    【讨论】:

    • @JasperSquire 很高兴为您提供帮助!理想情况下,如果scan.nextInt() 调用在另一个方法中,您应该将scan.nextLine() 调用放在它之后而不是do-while 循环之前。这将保证您在scan.nextInt() 之后调用的任何方法都将有一个干净的输入。
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多