在 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 库中的行号找出解决方案。
这里可能至少有两个问题:
不要关闭 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) { ...
调用next()
后调用nextLine()
也会导致
问题,在这里解释:
Scanner is skipping nextLine() after using next() or nextFoo()?:
要解决第二个问题,您可以每次都调用 nextLine()
,
而不是 next()
(或使用 link 中所示的换行符):
id = s.nextLine();
我对 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 库中的行号找出解决方案。
这里可能至少有两个问题:
不要关闭
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) { ...
调用
next()
后调用nextLine()
也会导致 问题,在这里解释: Scanner is skipping nextLine() after using next() or nextFoo()?:要解决第二个问题,您可以每次都调用
nextLine()
, 而不是next()
(或使用 link 中所示的换行符):id = s.nextLine();