投掷一个抛出另一个物体的物体

时间:2014-06-16 20:08:33

标签: java

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的构造函数抛出异常?任何人都可以描述步骤的顺序吗?

3 个答案:

答案 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引发异常。