繁体   English   中英

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

[英]Cannot throw instance of private member class? - 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运算符不适用于我的成员类,以及如何抛出私有成员类的实例。

如果我必须根据您发布的代码片段猜测发生了什么,可能是因为您尝试从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 ')'";
    }
}

private之后的static表示ParenthesisException不会将引用保存回封闭对象,这可能是您想要的。 这也意味着您可以在静态方法中创建new ParenthesisException

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

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

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

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

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

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

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

private static class ParenthesisException extends Throwable

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

没有代码这绝对是猜测,但基于错误消息,我相信这将工作。 如果你的main类是Animal那么你需要在main中实例化Animal ,如果你做一个简单的...

new Animal(); 作为唯一的main

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM