用于测试输入和引发异常的程序在JAVA中引发异常时如何重新启动

用于测试输入和引发异常的程序在JAVA中引发异常时如何重新启动,java,exception-handling,while-loop,do-while,throws,Java,Exception Handling,While Loop,Do While,Throws,这个程序的基本思想是测试用户输入,并在输入无效数据时抛出我创建的异常。例如:名称不能为空,必须是所有字母字符(无特殊或数字)。我已经将其嵌入到一个do-while循环中,只要不输入q就可以退出。我通过扫描线读取用户输入,然后将输入的字符串发送到一个函数,该函数验证它是否符合标准。如果没有,则函数抛出我的自定义异常。这一切都可以正常工作,除了抛出异常时,它仍然会获取该字符串并将其放入新的Person对象中 如何向用户抛出异常,然后要求他们重新输入姓名或年龄,直到正确输入为止 do{ Sca

这个程序的基本思想是测试用户输入,并在输入无效数据时抛出我创建的异常。例如:名称不能为空,必须是所有字母字符(无特殊或数字)。我已经将其嵌入到一个do-while循环中,只要不输入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.");
            }
        }
    }
}
do{
扫描仪输入=新扫描仪(System.in);
System.out.println(“输入人员信息或q退出”);
System.out.print(“请输入此人姓名:”);
字符串名称=input.nextLine();
if(名称、等效信号情况(“q”))
{
打破
}
试一试{
isName(name);
}捕获(InvalidNameException n){
系统输出println(n);
}
System.out.print(“请输入此人的年龄:”);
字符串年龄=input.nextLine();
试一试{
有效期(年龄);
}捕获(无效异常a){
系统输出打印项次(a);
}
公共静态void isName(字符串名称)引发InvalidNameException
{
if(name.isEmpty())
{
抛出新的InvalidNameException(“您没有输入名称”);
}
字符串[]namez=name.split(“”);

对于(int i=0;i在异常处理中放入一个
continue;
。它将中断循环并重新输入它。

我假设错误在您的isName()的兼容性范围内方法和方法循环。这可能也发生在它将名称设置为变量之后。我无法告诉您任何真正具体的事情,因为我看不到isName方法。

我知道的最简单的方法是使用正则表达式验证获得的字符串。您可以执行以下操作:

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; %s\nEdad: %s",name,age);
               break;
           }catch (InvalidAgeException a){
               System.out.println(a);
               continue;
           }
        } while (true);   

对不起,你能再进一步解释一下吗?理解其背后的逻辑有困难!a continue;在catch子句中?正确。在catch子句中。谢谢!成功了!当我将数据放入Person obj时,我在do的底部也有一个错误,即使它不正确。我没有意识到它没有包含在试试block。现在一切正常!isName只接受字符串名称并检查它是否有特殊字符。它没有返回。如果名称为空或包含特殊字符,则抛出新异常。我将编辑原始名称以在底部显示它。好的,因此它不在isName()中方法,就像我说的那样,我真的不能确定。记住,你也可以在捕获后使用
finally
子句,它将执行!另外,记住如果飞行员的回答对你有效,请将其标记为正确!