不能抛出私有成员类的实例? - Java

时间:2011-07-24 23:46:06

标签: java exception static inner-classes

这个错误意味着什么,为什么适用?在与我的情况相关的案例中,我无法找到关于成员类和静态上下文的内容以及这些内容的详细信息。

这是我得到的错误:

non-static variable this cannot be referenced from a static context

它指向此行,并指向new运算符:

throw new ParenthesisException();

ParenthesisException是主类的私有成员类。我认为问题可能与此有关,但这就是我能想到的全部。

这是我对ParenthesisException的定义。它在主类定义中:(如果格式不是很好,我很抱歉)

private class ParenthesisException extends Throwable
{
    public ParenthesisException(){}
    public String strErrMsg()
    {
        return "ERROR: Every '(' needs a matching ')'";
    }
}

我发现错误信息相当神秘。我将非常感谢“静态上下文”的简要说明,以及为什么new运算符不适用于我的成员类,以及如何抛出私有成员类的实例。

4 个答案:

答案 0 :(得分:6)

如果我必须根据您发布的代码片段猜测发生了什么,可能是因为您尝试从ParenthesisException方法中抛出static而导致错误。< / p>

在Java中,在另一个类中定义的类会自动存储指向创建它们的对象的指针。那就是ParenthesisException有一个隐式指针,指向封闭类,其内部是用new创建的。这意味着,特别是,您无法在new ParenthesisException方法内构造static,因为没有this指针可用于引用包含类。

要解决此问题,您应该ParenthesisException static这样的内部类:

private static class ParenthesisException extends Throwable
{
    public ParenthesisException(){}
    public String strErrMsg()
    {
        return "ERROR: Every '(' needs a matching ')'";
    }
}

static之后的private表示ParenthesisException没有将引用反馈给封闭对象,这可能是您想要的。这也意味着您可以在静态方法中创建new ParenthesisException

希望这个猜测是正确的,希望这会有所帮助!

答案 1 :(得分:0)

如果您之前没有看到错误,那么错误有点令人困惑,但它正是它所说的:您不能使用非静态上下文中的非静态变量。您的main方法,并且很可能是包含main方法的类中的任何方法都是静态的,因此您不能使用非静态变量。

ParenthesisException是非静态的,因为您尚未将其声明为静态,但它在主类中声明并在静态方法中调用。

不要将此声明为内部类 - 使您成为一个新的公共类。然后,您就可以实例化此异常。

答案 2 :(得分:0)

您的主要功能是'静态上下文'。你只能调用静态函数,而不是'this'。当您尝试创建新的异常时,您实际上会调用this.new ParenthesisException(),因为异常是内部类。但你不能这样做。您需要创建主类的istance,然后在该实例上创建异常对象。

MainClass m = new MainClass();
throw m.new ParenthesisException();

另一种解决方案是将您的异常定义为静态类:

private static class ParenthesisException extends Throwable

然后你可以从静态上下文中实例化它,所以你不需要主类的实例。

答案 3 :(得分:0)

没有代码这绝对是猜测,但根据错误消息,我相信这会起作用。如果您的main班级为Animal,那么您需要实例化Animal,以便在主要内容中进行简单...

new Animal();main

中的唯一一行

然后制作一个新方法......

public Animal(){
    /* put code that used to be in main */
}

这很可能会解决你的问题....再次没有完整的代码这绝对是一个猜测,但根据你说的和我认为这将解决问题的错误。