2

我创建了自己的可抛出异常,但是当我想抛出它时,编辑说,需要对封闭类的引用。我不知道,我需要写什么。

这是代码:

public class Main {
    int i = 0;
    public Main() {
        if (i == 0) throw new MyException("i must not be 0"); //Here it says about enclosing class
    }
    public static void main(String[] args) throws Exception {
        new Main();
    }
    public class MyException extends Exception {
        public MyException(String e) {
            super(e);
        }
    }
}

有人可以告诉我,我必须在哪里写什么?

4

3 回答 3

2

您已将 MyException 定义为 Main 的内部类,然后创建了它的一个实例,但没有对应的 Main 实例可用(因为 main 方法是静态方法)。

您需要在 Main 之外单独声明异常类。将访问从公共更改为包私有可以让您将声明保存在同一个文件中。否则,由于每个文件只能有一个公共类,因此它需要放在自己的文件中。

或者,您可以将其定义为静态内部类,如下所示:

public class Main {
    int i = 0;
    public static void main(String[] args) throws Exception {
        if (i == 0) throw new MyException("i must not be 0"); //Here it says about enclosing class
    }

    static class MyException extends Exception {
        public MyException(String e) {
            super(e);
        }
    }
}

使类静态意味着它不引用封闭类的实例。

于 2013-09-03T17:27:17.670 回答
1

要么MyException将类声明为static

public static class MyException extends Exception {
    public MyException(String e) {
        super(e);
    }
}

或者在它自己的可编译.java文件中声明它。

你现在拥有它的方式MyException是一个内部类,它需要初始化Main一个实例。Main

throw new Main().new MyException("i must not be 0");

编辑后,显然一切正常......

于 2013-09-03T17:29:18.367 回答
1

这是一个普遍的问题:你的类MyException是你的类的一个嵌套类Main,它总是持有对其封闭实例的引用。你也想创建那个异常类static

或者,通常但在这种情况下可能不是,您可以使用外部类的实例来实例化内部类:

Main m = new Main();
throw m.new MyException();

是的,这是点之后的新内容。

于 2013-09-03T17:29:36.620 回答