JAVA:验证一个字符的用户输入

时间:2018-03-15 19:54:03

标签: java input

这是我第一次提问。如果我违反任何规则,请告诉我:)

我想验证用户只输入一个字符并存储在我最初已声明的变量中。同样,如果用户没有按照要求进行操作,请回退问题以便用户再次输入

这是我到目前为止所做的事情

import java.util.Scanner;

public class arraytesting {

public static void main(String[] args) {
    Scanner myKeyboard = new Scanner(System.in);
    int user_Choice;
    int rowAndcolumns;
    char[][] user_Array;
    char user_Char;
    do {
        System.out.print("Enter your choice (1 to 9): ");
        user_Choice = myKeyboard.nextInt();
        if (user_Choice < 1 || user_Choice > 9)
            System.out.println("Illegal choice, please try again.");
    } while (user_Choice < 1 || user_Choice > 9);

    switch (user_Choice) {
    case 1:
        do {
            System.out.print("\nHow many rows and columns (min 4 & max 20)? ");
            rowAndcolumns = myKeyboard.nextInt();
            if (rowAndcolumns < 1 || rowAndcolumns > 9)
                System.out.println("Illegal choice, please try again.");
        } while (rowAndcolumns < 4 || rowAndcolumns > 20);

        do {
            System.out.print("Which character do you want to fill your square with? (only one character)");
            user_Char = myKeyboard.next().charAt(0);
            if () // error message for user if they did not type correctly, Idk what to put in the
            System.out.println("Illegal choice, please try again.");// boolean for it to compare
                System.out.print(user_Char);
        } while (); // using do-while loop to loop back question, if they don't type in correctly, i
                                // would only like for user to type in only one character
        break;
    }
}

}

我知道我可以将它们都放在一个do-while循环中,但我想专注于获取布尔值来检查用户输入。

编辑:我只希望用户只输入一个字符 恩。 '@'或'a' 而“@@”或“我正在输入不是一个字符的东西”是错误的 在ifwhile的空格内是我希望它被验证的方式

2 个答案:

答案 0 :(得分:1)

请根据与Max的讨论检查下面的代码,我使用.length()方法检查用户输入的字符串的长度。

您可以使用Character类中的某些方法检查字符的类型以避免第一个if语句中的runtime异常,该方法用于检查输入是否为数字/字母?

  

Character.isDigit(char)的

     

Character.isLetter(char)

     

Character.isLetterOrDigit(char)的

我还更改了一些变量名,Java遵循camel case样式,类名必须大写。我还重构了一些代码来检查数字的范围,以便不再重复相同的代码,检查方法betweenExclusive

package stackoverflow.q2;

import java.util.Scanner;

public class Question2 {

public static void main(String[] args) {
    Scanner myKeyboard = new Scanner(System.in);
    int userChoice;
    int rowAndcolumns;
    char[][] user_Array;
    char userChar;
    do {
        System.out.print("Enter your choice (1 to 9): ");
        userChoice = myKeyboard.nextInt();
        if ( !betweenExclusive(userChoice, 1,9) )
            System.out.println("Illegal choice, please try again.");
    } while (!betweenExclusive(userChoice, 1,9));

    switch (userChoice) {
        case 1:
            do {
                System.out.print("\nHow many rows and columns (min 4 & max 20)? ");
                rowAndcolumns = myKeyboard.nextInt();
                if (!betweenExclusive(rowAndcolumns ,1 , 9))
                    System.out.println("Illegal choice, please try again.");
            } while (!betweenExclusive(rowAndcolumns ,4 , 20));

            String input;
            while (true){
                System.out.print("Which character do you want to fill your square with? (only one character)");
                input = myKeyboard.next();
                // error message for user if they did not type correctly, Idk what to put in the
                // boolean for it to compare
                if ( input.length()>1){
                    System.out.print("Illegal character, try again please !!! ");
                }else{
                    userChar = input.charAt(0);
                    System.out.print(userChar);
                    break;
                }
            }  // using do-while loop to loop back question, if they don't type in correctly, i
            // would only like for user to type in only one character
        break;
    }
}

public static boolean betweenExclusive(int x, int min, int max)
{
    return x>=min && x<=max;
}

}

答案 1 :(得分:1)

没有必要检查&#34;只输入1个字符&#34;。这是没有意义的。您无法预测未来,因此您无法知道用户是否在输入1个字符后输入更多字符。您将只输入输入的第一个字符并使用它并忽略任何可能的附加字符 - 或者您必须等待超过1个字符,这实际上是为执行正确操作的用户(仅输入一个字符)打破程序,能够在他们最终做错事时给他们一个错误信息(输入另一个角色)。

话虽如此,这段代码:

user_Char = myKeyboard.next().charAt(0);

实际上会等待输入几个字符,直到输入某种分隔符(默认情况下为某些空白字符,例如换行符)。这完全是你不想要的东西

您希望从输入中获取一个字符,而只需输入一个字符。在此之后,您不必关心输入更多字符:

user_Char = myKeyboard.next(".").charAt(0);

这会告诉myKeyboard返回与正则表达式&#34;。&#34; 匹配的下一个String,这是任何字符,只有1个字符。

如果要验证输入的字符,例如只允许使用字母数字字符,您可以将ifwhile更新为以下内容:

if (!Pattern.matches("[a-zA-Z0-9]", new String(user_Char)))

甚至更好,使用String返回的myKeyboard.next(".")

String user_String = myKeyboard.next(".");
user_Char = user_String.charAt(0);
if (!Pattern.matches("[a-zA-Z0-9]", user_String))

或者您可以直接告诉myKeyboard仅允许有效字符并跳过整个do/if/while错误处理:

user_Char = myKeyboard.next("[a-zA-Z0-9]").charAt(0);

修改

您的代码目前无法处理的一件事是无效输入,例如致电nextInt时的字母。这实际上会抛出java.util.InputMismatchException,您可能希望将nextInt()next(...)个调用封装在try-catch块中以处理这些异常。