从本质上讲,这个程序的想法是测试用户输入,并在输入无效数据时抛出我创建的异常。例如:name不能为空,并且必须全部为字母字符(没有特殊字符或数字字符)。我已经把它嵌入了一个dowhile循环中,只要不输入q就可以退出。我通过扫描线读取用户输入,然后将输入的字符串发送到一个函数,以验证它是否符合标准。如果没有,那么函数将抛出我的自定义异常。这一切都很好,只是当抛出异常时,它仍然使用该字符串并将其放入新的Person对象中。
如何向用户抛出异常,然后要求他们重新输入姓名或年龄,直到输入正确为止?
do{
Scanner input = new Scanner(System.in);
System.out.println("Enter person info or q to quit.");
System.out.print("Please enter the name of this person:");
String name = input.nextLine();
if(name.equalsIgnoreCase("q"))
{
break;
}
try{
isName(name);
}catch (InvalidNameException n){
System.out.println(n);
}
System.out.print("Please enter an age for this person:");
String age = input.nextLine();
try{
isValidAge(age);
}catch(InvalidAgeException a){
System.out.println(a);
}
public static void isName(String name) throws InvalidNameException
{
if(name.isEmpty())
{
throw new InvalidNameException("You did not enter a name.");
}
String[] namez = name.split(" ");
for(int i=0;i<namez.length;i++)
{
char[] charz = namez[i].toCharArray();
for (char n : charz)
{
if(!Character.isLetter(n))
{
throw new InvalidNameException("You have entered an invalid name.");
}
}
}
}
在异常处理中放入continue;
。它将中断循环并重新进入。
我认为错误在于isName()方法和所示方法循环的兼容性。它可能也会在将名称设置为变量之后发生。我不能告诉你任何真正具体的东西,因为我看不到isName方法。
我知道的最简单的方法是使用正则表达式验证获得的String。你可以这样做:
Scanner input = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = input.nextLine();
String regex = "[A-Z a-z]+(\s)[A-Z a-z]+";
System.out.println(name.matches(regex)? "matches": "does not match");
表达式regex
用于计算由空格分隔的字母字符序列(没有数字或特殊字符)。所以,像"Joe Smith"这样的东西会通过验证,但像"Joe 123Klkjsd"这样的不会。
您可以使用此代码并在while()
循环中测试输入字符串:
while(!name.matches(regex))
{
// Prompt the user to re-enter a valid name and assign to name variable
}
这样的东西应该行得通。
最好在do-while循环中评估每个变量。因此,如果变量age
中存在错误,则不必重新输入名称。
Scanner input = new Scanner(System.in);
String name;
String age;
System.out.println("Enter person info or q to quit.");
do{
System.out.print("Please enter the name of this person: ");
name = input.nextLine();
if(name.equalsIgnoreCase("q")) break;
try{
isName(name);
break;
}catch (InvalidNameException n){
System.out.println(n);
continue;
}
} while (true);
if(!name.equalsIgnoreCase("q"))
do{
System.out.print("Please enter an age for this person: ");
age = input.nextLine();
if(age.equalsIgnoreCase("q")) break;
try{
isValidAge(age);
System.out.printf("Nombre; %snEdad: %s",name,age);
break;
}catch (InvalidAgeException a){
System.out.println(a);
continue;
}
} while (true);