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

时间:2014-11-03 20:30:03

标签: java exception-handling while-loop do-while throws

本程序的基本思想是测试用户输入并抛出我输入无效数据时创建的异常。例如:name不能为空,必须是所有字母字符(无特殊或数字)。我已经在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.");
            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

在您的异常处理中添加continue;。它将打破循环重新进入它。

答案 1 :(得分:0)

我认为错误在于isName()方法和显示的方法循环的兼容性。它可能在将名称设置为变量之后发生。我无法告诉你任何真正具体的内容,因为我无法看到isName方法。

答案 2 :(得分:0)

我知道这样做的最简单方法是使用正则表达式验证获取的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用于评估由空格分隔的字母字符序列(无数字或特殊字符)。所以,像:#34; Joe Smith&#34;将通过验证,但类似于&#34; Joe 123Klkjsd&#34;不会。

您可以使用此代码并在while()循环中测试输入字符串:

while(!name.matches(regex))
{
  // Prompt the user to re-enter a valid name and assign to name variable
}

这样的事情应该有用。

答案 3 :(得分:0)

在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);