在 Java 中设置值时出现 InvocationTargetException

InvocationTargetException while setting values in Java

我对 InvocationTargetException 有疑问。 我正在使用扫描仪设置对象的值,这对我来说变成了 return 这样奇怪的异常。我确实阅读了文档,并且正在互联网上搜索以找到解决方案,但我无法弄清楚出了什么问题。 也不要阅读 println 字符串,它们是我的母语。

public Person SignPerson() { 

    Scanner scanner = new Scanner(System.in);
    System.out.println("Tworzymy twoje konto użytkownika, podaj dane osobowe");
    System.out.println("Podaj swoj pesel");

    String id = setPersonalId();
    Person person = new Person(id);
    System.out.println("Podaj swoje imie");
    person.setFirstName(scanner.nextLine()); // the line taht causes problem (other 
                                                // scanners also throws exceptions)
    System.out.println("Podaj drugie imie");
    //tutaj powinien byc wgrany drugi kod do odczytu imienia
    System.out.println("Podaj nazwisko");
    person.setLastName(scanner.nextLine());
    System.out.println("Podaj nazwisko panienskie matki");
    person.setMotherMaidensName(scanner.nextLine());

    return person;
}

public static String setPersonalId() {
    String id;
    try (
            Scanner scanner2 = new Scanner(System.in);
    ) {
        id = scanner2.next();

        char[] chars = id.toCharArray();

        for (char aChar : chars) {
            if (!(aChar >= '0' && aChar <= '9'))
                throw new InvalidStringException();
        }

        return id;
    } catch (InvalidStringException e) {
        System.out.println("Wprowadziles niepoprawny pesel");
    }

    return null;
}

在 Exception e 块内部打印 e.printStackTrace(),然后它指向 JDK 库中的实际堆栈跟踪。进入库的内部,找出哪一行抛出错误,并根据 JDK 库中的行号找出解决方案。

这里可能至少有两个问题:

  1. 不要关闭 Scanner 包装 System.in,因为这也会 关闭底层流。 (看 Close a Scanner linked to System.in)

    要解决此问题,请从中删除第二个 Scanner 的创建 try-with-resource 块,以避免它被关闭 自动地。您也可以不创建第二个扫描仪,但通过 第一个到将使用它的方法。

    String id = setPersonalId(scanner);
    

    在你的 setPersonalId:

    public static String setPersonalId(Scanner s) { ...
    
  2. 调用next()后调用nextLine()也会导致 问题,在这里解释: Scanner is skipping nextLine() after using next() or nextFoo()?:

    要解决第二个问题,您可以每次都调用 nextLine(), 而不是 next()(或使用 link 中所示的换行符):

    id = s.nextLine();