public class Exceptions {
static class Second extends RuntimeException {
public Second() {
throw this;
}
}
static class First extends RuntimeException {
public First() {
throw new Second();
}
}
public static void main(String[] args) {
throw new First();
}
}
Result:
Exception in thread "main" Exceptions$Second
at Exceptions$First.<init>(Exceptions.java:14)
at Exceptions.main(Exceptions.java:19)
Java Result: 1
大家晚上好!
我无法理解结果。
为什么类Second
的构造函数抛出异常?任何人都可以描述步骤的顺序吗?
答案 0 :(得分:4)
在throw
语句实际执行任何抛出之前,必须评估其参数。
throw new First();
这将我们带到First
构造函数:
public First() {
throw new Second();
}
将我们带到Second
构造函数(再次之前 throw
可以执行)。 Second
构造函数会抛出一个未捕获的异常(在本例中为自己),这就是您所看到的。
答案 1 :(得分:1)
您会看到异常,因为构造函数初始化发生在throw
。
原因很简单。当您执行new First()
时,您创建的类型为First的对象,在First
的构造函数中,您调用Second
并抛出this
,即Second
错误的来源是因为你正在抛出一个新的Second()。
你的课程可以是这样的,你会继续看到错误:
public class Exceptions {
static class Second extends RuntimeException {
public Second() {
throw this;
}
}
static class First {
public First() {
throw new Second();
}
}
public static void main(String[] args) {
new First();
}
}
答案 2 :(得分:0)
throw new First()构造函数创建第二个对象,在构造对象之前,从第二个对象抛出异常。您可以使用Exceptions $ First中的行来查看此内容。(Exceptions.java:14)。因此,第二个对象从未正确初始化,以便首先完成其工作并为main引发异常。