2011-07-24 22 views
4

这个错误是什么意思,它为什么适用?我无法在Google中找到关于成员类和静态上下文的更多信息,或者这些意思与我的情况有关。不能抛出私有成员类的实例? - Java

这里是我得到的错误:

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运算符不适用于我的成员类,以及我如何抛出一个私有成员类的实例。

+1

您需要发布错误代码。私人班似乎不是问题。 – g051051

回答

6

如果我必须根据您发布的代码片段猜测发生了什么,则可能是由于您试图从static方法中抛出ParenthesisException而导致的错误。

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

为了解决这个问题,你应该ParenthesisException一个static内部类是这样的:

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

staticprivate后说,ParenthesisException不持有引用回到一个封闭的对象,这可能是你无论如何。这也意味着您可以在静态方法内部创建new ParenthesisException

希望这个猜测是正确的,希望这有助于!

+0

我感谢您的解释!它似乎已经工作了。谢谢! – Uronym

0

如果您之前没有看到它,该错误有点令人困惑,但它正是这样说的:您无法在非静态上下文中使用非静态变量。你的主要方法和很可能包含你的主要方法的类中的任何方法都是静态的,所以你不能使用它的非静态变量。

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

不要声明这是一个内部类 - 让你成为一个新的公共类。然后你就可以实例化这个异常。

0

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

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

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

private static class ParenthesisException extends Throwable 

然后你就可以从静态上下文实例,所以你并不需要主类的一个实例。

0

没有代码,这是严格的猜测,但基于错误信息,我相信这会起作用。如果您main类是Animal那么您需要实例Animal这样的主内,如果你做一个简单的...

new Animal();作为唯一的行main

然后作出一个新的方法....

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

这将最有可能解决您的问题....再次没有完整的代码这是严格的猜测,但根据你说的和我认为这将解决问题的错误。