Java 如何仅为整数创建自定义异常

Java 如何仅为整数创建自定义异常,java,exception,Java,Exception,我想创建一个类作为例外。我将给你两个我如何尝试的例子。我一直在寻找它,但我找不到一个如何将其付诸实践的例子,或者它对我不起作用 这是我的方法,用户通过ID选择航班,如果程序用户输入字符串,我想抛出一个异常 code: @Override public void choosePassenger(ArrayList<Passenger> passengerList) { System.out.println("Choose passenger by ID: "

我想创建一个类作为例外。我将给你两个我如何尝试的例子。我一直在寻找它,但我找不到一个如何将其付诸实践的例子,或者它对我不起作用

这是我的方法,用户通过ID选择航班,如果程序用户输入字符串,我想抛出一个异常

code:

@Override
public void choosePassenger(ArrayList<Passenger> passengerList) {
    System.out.println("Choose passenger by ID: ");
    try {
        int pickedPassenger = scanner.nextInt();
        for (Passenger tempUser : passengerList) {
            if (pickedPassenger == tempUser.getId()) {
                System.out.println("You picked passenger: " + tempUser.getFirstName() + ", "
                        + tempUser.getLastName() + ". Balance is: " + tempUser.getBalance());
                selectedPassenger = tempUser;
                break;
            }
        }
    } catch (InputMismatchException e) {
        System.out.println("Wrong input! Try again");
        scanner.nextLine();
    }
}
这是允许程序用户创建新用户的代码的一部分,他在这里添加名称,我想创建异常,所以如果程序用户为名称添加整数,我想向他显示一个异常

编辑:


如果我删除scanner.nextLine()程序停止,但首先打印我自己的异常消息,然后从下一个方法打印我的消息,然后自己为该方法输入
InputMissMatchException
,因为我输入的是字符串而不是整数

如果希望用户重试,可以将它们保持在一个无限循环中,在正确输入后中断

根据@DevilsHnd观察进行编辑。您不能以这种方式使用scanner.nextInt(),因为它将在不提示用户输入的情况下读取,并导致陷入无限循环。 然后,您可以使用nextLine()并验证输入是否为如下所示的数字:

while(true) {
    try {
        int pickedPassenger = Integer.parseInt(scanner.nextLine());
    } catch (NumberFormatException e) {
        System.out.println("Wrong input! Try again");
    }
}
要将输入限制为名称所需的非数字值,必须检查输入的值是否为数字(没有扫描仪方法将读取限制为非数字值)

在我看来,最优雅的方式是使用一个外部库,它具有类似Apache Commons的特性:

while(true) {
    String firstName = scanner.nextLine();
    if (!NumberUtils.isCreatable(firstName )) {
        passenger.setFirstName(firstName );
        break;
    } else {
        System.out.println("Value cannot be a number!");
    }
}

但是,如果不能导入外部库,最简单的方法是使用内置java整数.PARSETIN()函数(尽管您可能需要考虑正则表达式-参见下面的链接):

有关检查值是否为数字(如regex)的更多选项,请检查以下内容:

这是否回答了您的问题?首先,你必须考虑“为什么我需要远离当前可用的异常?”,最重要的是,“我怎么能完全避免例外?”没有人希望遇到异常,尤其是你的应用程序的用户。嗨,我目前正在练习,也许在这种情况下我不需要特殊异常,因为程序本身已经在做了,但我想学习如何手动实现它。对名称设置任何限制都不是一个好主意。有一段时间,普林斯把他的名字改成了一个无法发音的音节。然后是弗兰克·扎帕的女儿,月亮单位(她的名字)。然后,有很多美国人的名字的首字母和中间名;在我一生的大部分时间里,除了中间名字段外,我拒绝在任何字段中输入我的中间名。有人告诉我,有些人的名字是数字的。请仔细看看你的例子。在发布示例之前测试它们。
while(true) {
    String firstName = scanner.nextLine();
    if (!NumberUtils.isCreatable(firstName )) {
        passenger.setFirstName(firstName );
        break;
    } else {
        System.out.println("Value cannot be a number!");
    }
}
while(true) {
    String firstName = scanner.nextLine();
    try {
        Integer.parseInt(firstName);
        System.out.println("Value cannot be a number!");
    } catch (NumberFormatException e) {
        passenger.setFirstName();
        break;
    }
}