Не можете выбросить экземпляр класса закрытого члена? - Джава - PullRequest
4 голосов
/ 25 июля 2011

Что означает эта ошибка и почему она применяется?Я не могу найти в Google много информации о классах членов и статических контекстах, или о том, что они значат, в случае, который кажется мне подходящим.

Вот ошибка, которую я получаю:

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 ]

6 голосов
/ 25 июля 2011

Если бы мне пришлось угадывать, что происходит, основываясь на фрагменте кода, который вы разместили, ошибка, вероятно, вызвана тем, что вы пытаетесь выбросить ParenthesisException из static метода.

В 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 s внутри статических методов.

Надеюсь, что это предположение верно, и надеюсь, что это поможет!

0 голосов
/ 25 июля 2011

Ваша основная функция - «статический контекст».Вы можете вызывать только статическую функцию, и здесь нет «this».Когда вы пытаетесь создать новое исключение, вы фактически вызываете this.new ParenthesisException(), потому что это внутренний класс.Но ты не можешь этого сделать.Вам необходимо создать экземпляр вашего основного класса, а затем создать объект исключения для этого экземпляра.

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

Другое решение состоит в том, чтобы определить ваше исключение как статический класс:

private static class ParenthesisException extends Throwable

Тогдавы можете создать его экземпляр из статического контекста, поэтому вам не нужен экземпляр основного класса.

0 голосов
/ 25 июля 2011

Без кода это строго предположение, но на основании сообщения об ошибке я думаю, что это сработает. Если ваш main класс Animal, вам нужно создать экземпляр Animal, поэтому внутри main, если вы делаете простое ...

new Animal(); как единственная строка в main

затем создайте новый метод ....

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

Это, скорее всего, решит вашу проблему .... опять же, без полного кода это строго предположение, но на основании того, что вы сказали, и ошибки, я думаю, это решит проблему.

0 голосов
/ 25 июля 2011

Ошибка немного сбивает с толку, когда вы ее раньше не видели, но это именно то, о чем она говорит: вы не можете использовать нестатическую переменную из нестатического контекста. Ваш метод main и, скорее всего, любой метод в классе, который содержит ваш метод main, является статическим, поэтому вы не можете использовать нестатическую переменную из него.

ParenthesisException не является статичным, поскольку вы не объявили его как статический, но он объявлен в вашем основном классе и вызван в статическом методе.

Не объявляйте это как внутренний класс - сделайте ваш новый открытый класс. После этого вы сможете создать это исключение.

...