java 该程序跳过键盘.nextLine

hjzp0vay  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(99)

在运行以下代码时,当我回答问题时:你有18年以上的吗直接说:

  • 你是个成年人
  • 创建您的密码
  • 请创建一个6到10个字母之间的密码
    而它应该在创建您的密码时停止。等待我的输入,如果输入长度超出范围,则应显示下一条消息。
    但它不会等待我的输入,而是显示下一条消息。
    当我删除问题时:你有超过18年吗?(是/否)
    程序运行得很好。
import java.util.Scanner;

class ScannerTest {
    public static void main(String[] args) {
        Scanner clavier = new Scanner(System.in);
        String name;
        String password;
        String time;
        char adult;

        System.out.println("Hello,create your username:\t");
        name = clavier.nextLine();

        System.out.println("Welkom " + name);
        System.out.println("Do you have more than 18 years? (Yes/No)");
        adult = clavier.findWithinHorizon(".", 0).charAt(0);

        if (adult == 'y' || adult == 'Y') {
            System.out.println("you are adult");
        } else {
            System.exit(0);
        }

        System.out.println("create your password:\t");
        password = clavier.nextLine();
        while ((password.length() < 6) || (password.length() > 10)) {
            System.out.println("please create a password between 6 and 10 letters");
            password = clavier.nextLine();
        }

        String password2;
        System.out.println("Please write your password again");
        password2 = clavier.nextLine();
        while (!password2.equals(password)) {
            System.out.println("your passwords aren't the same");
            password2 = clavier.nextLine();
        }
        System.out.println("acount create");
    }
}
x4shl7ld

x4shl7ld1#

这一点:

clavier.findWithinHorizon(".", 0).charAt(0);

不处理行尾(EOL)令牌,因此在您下一次调用clavier.nextLine()时会吞下它,这会使您陷入混乱。一种解决方案是在上面的行之后立即调用clavier.nextLine()

adult= clavier.findWithinHorizon(".", 0).charAt(0);
clavier.nextLine(); // to handle and dispose the EOL token

或者简单地在上面的代码中使用nextLine:

adult = clavier.nextLine().charAt(0);
btxsgosb

btxsgosb2#

问题出在这条线上

clavier.findWithinHorizon(".", 0).charAt(0);

根据该方法的文档
如果horizon是0,则忽略horizon,* 此方法继续在输入中搜索,查找 * 指定的模式,没有边界。在这种情况下,它可以缓冲搜索模式的所有输入。
因此,您可以使用以下代码来代替它。我基本上已经将char adult转换为String adult,并使用了nextLine()方法,就像在其他情况下一样。

import java.util.Scanner;

class mmm {

    public static void main(String[] args) {
        Scanner clavier = new Scanner(System.in);
        String name;
        String password;
        String time;
        String adult;

        System.out.println("Hello,create your username:\t");
        name = clavier.nextLine();
        System.out.println("Welkom " + name);

        System.out.println("Do you have more than 18 years? (Yes/No)");

        //adult = clavier.findWithinHorizon(".", 0).charAt(0);
        adult = clavier.nextLine();
        if (adult.equalsIgnoreCase("y")) {
            System.out.println("you are adult");
        } else {
            System.exit(0);

        }

        System.out.println("create your password:\t");

        password = clavier.nextLine();

        while ((password.length() < 6) || (password.length() > 10)) {
            System.out
                    .println("please create a password between 6 and 10 letters");
            password = clavier.nextLine();
        }

        String password2;
        System.out.println("Please write your password again");
        password2 = clavier.nextLine();
        while (!password2.equals(password)) {
            System.out.println("your passwords aren't the same");
            password2 = clavier.nextLine();
        }
        System.out.println("acount create");

    }
}

相关问题