Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
01 Апр 2023
2 мин
253

Решение ошибки «No enclosing instance of type Foo is accessible» в Java

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

Ошибки компиляции могут вызвать сбои в простейших программах, особенно когда речь идет о вложенных или внутренних классах. Одной из таких ошибок является «No enclosing instance of type Foo is accessible». Данная ошибка возникает при попытке создания экземпляра внутреннего (не статического) класса из статического контекста.

Представим следующий пример кода:

public class OuterClass {
    class InnerClass {
        public int value;

        InnerClass() {
            value = 0;
        }
    }

    public static void main(String[] args) {
        InnerClass instance = new InnerClass();
    }
}

Компилятор выдаст ошибку на строке, где создается новый экземпляр класса InnerClass.

Причина этой ошибки в том, что внутренний класс InnerClass не статический, а это значит, что он не может существовать без экземпляра внешнего класса OuterClass. В то же время метод main является статическим, а значит, не привязан к конкретному экземпляру класса.

Для решения этой проблемы есть несколько подходов:

  1. Сделать внутренний класс статическим. Это позволит ему существовать без экземпляра внешнего класса.
public class OuterClass {
    static class InnerClass {
        public int value;

        InnerClass() {
            value = 0;
        }
    }

    public static void main(String[] args) {
        InnerClass instance = new InnerClass();
    }
}
  1. Создать экземпляр внешнего класса и использовать его для создания экземпляра внутреннего класса.
public class OuterClass {
    class InnerClass {
        public int value;

        InnerClass() {
            value = 0;
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        InnerClass inner = outer.new InnerClass();
    }
}

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

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий