尝试捕获扫描仪

时间:2017-01-29 19:00:22

标签: java exception java.util.scanner

我正在使用Scanner来获取用户输入。如果用户输入了名称,我将其添加到ArrayList。如果用户没有输入名称,那么我想抛出异常,但我想继续获得答案的循环。

for(int i = 0; i < totalLanes; i++){
    runArr.add(this.addRacer());
}

public static String addRacer() throws NullPointerException{
    System.out.print("Enter a name for a racer: ");//Method uses try catch to catch a    NullPointerException.   
    Scanner sc = new Scanner(System.in);
    String rName = null;
    try {            
        if(!sc.nextLine().isEmpty()){
            rName = sc.nextLine();
        }else{
            throw new NullPointerException("name cannot be blank");
        }
    }

    catch (NullPointerException e) {
        System.out.println(e.toString());
        System.out.print("Enter a name for a racer: ");
        addRacer();
    }
    return rName;
}
  • 为什么这会无限地递归呢?
  • 从用户检索输入但是生成的最佳方法是什么 确定他们输入的是有效数据吗?

提前致谢。

5 个答案:

答案 0 :(得分:1)

问题是你读了两次输入。 我的意思是你的代码中有两个sc.nextLine()方法调用。 试试这个:

String rName = sc.nextLine();
try {
    if(rName.isEmpty()){
        throw new NullPointerException("Name cannot be blank.");
    }
}

答案 1 :(得分:0)

你不应该为此抛出异常。只需使用while循环:

String rName = sc.nextLine();
while (rName.isEmpty()) {
    System.out.println("Name can't be blank. Try again.");
    rName = sc.nextLine();
}
return rName;

在该循环之后,您可以确保变量中包含非空名称,并且可以使用该名称添加新的赛车。你不需要递归。

答案 2 :(得分:0)

您可以在案例中使用do{}while(),这可能是更好的方法:

Scanner sc = new Scanner(System.in);
String rName;

do {

    System.out.print("Enter a name for a racer: ");
    rName = sc.nextLine();
    try {
        if (rName.isEmpty()) {
            //throw and exception
            throw new NullPointerException("name cannot be blank");
        }
    } catch (NullPointerException e) {
        //print the exception
        System.out.println(e.getMessage());
    }

} while (rName.isEmpty());

return rName;

所以你不能打破你的循环,直到值为非空。

答案 3 :(得分:0)

  

如果用户没有输入名称,那么我想抛出异常,   但是我想继续得到答案的循环。

为此你需要使用while loop

  

从用户检索输入的最佳方法是什么,但要确保   他们正在输入有效数据?

使用应该执行的while loop,直到用户输入有效输入。您不需要使用递归来实现您想要实现的目标。

  public static String addRacer() throws NullPointerException{
    System.out.print("Enter a name for a racer: ");
    Scanner sc = new Scanner(System.in);
    String rName = null;
    try {  
         String rName = sc.nextLine();  

        if(rName.isEmpty()){
            throw new NullPointerException("name cannot be blank");
        }
            while (rName.isEmpty()) {
               System.out.println("Name can't be blank. Try again.");
               rName = sc.nextLine();
            }
    }

    catch (NullPointerException e) {
        System.out.println(e.toString());
    }
    return rName;
}

答案 4 :(得分:0)

不要在catch中调用addRacer()函数。并删除我标记的行。如果还有条件递归。

catch (NullPointerException e) {
        System.out.println(e.toString());
        System.out.print("Enter a name for a racer: ");//remove this
        addRacer();//remove this
    }