362 Stimmen

Was verursacht den Fehler "No enclosing instance of type Foo is accessible" und wie kann ich ihn beheben?

Ich habe den folgenden Code:

class Hello {
    class Thing {
        public int size;

        Thing() {
            size = 0;
        }
    }

    public static void main(String[] args) {
        Thing thing1 = new Thing();
        System.out.println("Hello, World!");
    }
}

Ich weiß Thing bewirkt nichts, aber mein Hello, World-Programm lässt sich auch ohne diese Option kompilieren. Es ist nur meine definierten Klassen, die auf mich scheitern.

Und es weigert sich, zu kompilieren. Ich bekomme No enclosing instance of type Hello is accessible." in der Zeile, die ein neues Thing erstellt. Ich vermute, entweder:

  1. Ich habe Probleme auf Systemebene (entweder in DrJava oder meiner Java-Installation) oder
  2. Ich habe einige grundlegende Missverständnisse darüber, wie man ein funktionierendes Programm in Java konstruiert.

Irgendwelche Ideen?

4voto

Vor Java 14 Sie müssen das Schlüsselwort static zur Zugriffsklasse hinzufügen Thing aus dem statischen Kontext.

class Hello {
    static class Thing {
        public int size;

        Thing() {
            size = 0;
        }
    }

    public static void main(String[] args) {
        Thing thing1 = new Thing();
        System.out.println("Hello, World!");
    }
}

Java 14+ Ab Java 14 können Sie innere Datensatzklassen verwenden, die implizit statisch sind. Also würden Sie haben:

class Hello {
    record Thing(int size) { }

    public static void main(String[] args) {
        Thing thing1 = new Thing(0);
        System.out.println("Hello, World!");
    }
}

0voto

Maged Almaweri Punkte 272

Erklären Sie die INNERES Klasse Thing als statisch und es wird ohne Probleme funktionieren.

Ich erinnere mich, dass ich das gleiche Problem mit der inneren Klasse Dog hatte, als ich sie als Klasse deklarierte Hund { nur. Ich habe das gleiche Problem wie Sie. Es gab zwei Lösungen :

1- Die innere Klasse Dog als statisch zu deklarieren. Oder

2- Um die innere Klasse Dog in eine neue Klasse zu verschieben.

Hier ist das Beispiel:

public class ReturnDemo {

public static void main(String[] args) {

    int z = ReturnDemo.calculate(10, 12);
    System.out.println("z = " + z);

    ReturnDemo.Dog dog = new Dog("Bosh", " Doggy");
    System.out.println( dog.getDog());
}

public static int calculate (int x, int y) {
    return x + y;
}

public void print( ) {
    System.out.println("void method");
    return;
}

public String getString() {
    return "Retrun String type value";
}

static class Dog {

private String breed;
private String name;

public Dog(String breed, String name) {
    super();
    this.breed = breed;
    this.name = name;
}

public Dog getDog() {
    // return Dog type;
    return this;

}

public String toString() {
    return "breed" + breed.concat("name: " + name);
}
}

}

0voto

Johann Punkte 59

Versuchen Sie dies, mein Freund: (Sie können es auch Hello statt Main nennen)

class Thing {
  public int size;

    Thing() {
      size = 0;
    }
}

class Main {
  public static void main(String[] args) {
    Thing thing1 = new Thing();
      System.out.println("Hello, World!");
  }
}

Die Idee dahinter ist, dass Sie eine separate Klasse erstellen müssen, um die statische void main (String[] args) Methode einzubinden. Zusammenfassend lässt sich sagen, dass Sie eine Klasse haben müssen, die Ihre Objekte erstellt, und eine weitere Klasse (außerhalb der vorherigen), in die Sie die Objekterstellung aufnehmen. Wenn Sie sie Main nennen, sollten Sie eine Datei namens Main.java haben. Wenn Sie sie Hello nennen wollen, muss Ihre Datei Hello.java heißen.

0voto

Mark Punkte 1
class Hello {
    class Thing {
        public int size;

        Thing() {
            size = 0;
        }
    }

    public static void main(String[] args) {

        PlayGround obj = new PlayGround();

        Thing obj2 = obj.new Thing();

        System.out.println("Hello, World!");
    }
}

0voto

Rabhi salim Punkte 427

In meinem Fall lag es an einem zusätzlichen '}'.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X