Doit qualifier l'allocation avec une instance englobante de type GeoLocation

109

J'obtiens cette erreur comme-

Aucune instance englobante de type GeoLocation n'est accessible. Doit qualifier l'allocation avec une instance englobante de type GeoLocation (egxnew A () où x est une instance de GeoLocation). Cette erreur arrive sur la nouvelle ThreadTask (i) . Je ne sais pas pourquoi cela se produit. Toute suggestion sera appréciée.

public class GeoLocation {
    public static void main(String[] args) throws InterruptedException {
        int size = 10;

        // create thread pool with given size
        ExecutorService service = Executors.newFixedThreadPool(size); 

        // queue some tasks
        for(int i = 0; i < 3 * size; i++) {
            service.submit(new ThreadTask(i));
        }

        // wait for termination        
        service.shutdown();
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 
    }

    class ThreadTask implements Runnable {
        private int id;

        public ThreadTask(int id) {
            this.id = id;
        }

        public void run() {
            System.out.println("I am task " + id);
        }
    }

}
arsenal
la source
2
Voir cette réponse: stackoverflow.com/questions/633585/…
hmjd
Possibilité de duplication de Java - Aucune instance englobante de type Foo n'est accessible
Raedwald

Réponses:

150

Salut j'ai trouvé une solution pour ça ;-)

Cette erreur se produit car vous essayez de créer une instance d'une classe interne service.submit(new ThreadTask(i)); sans créer d'instance de classe principale.

Pour résoudre ce problème, créez d'abord une instance de la classe principale:

GeoLocation outer = new GeoLocation();

Créez ensuite l'instance de la classe que vous aviez l'intention d'appeler, comme suit:

service.submit(outer.new ThreadTask(i));

J'espère que cela résoudra votre problème ;-)

user1528582
la source
101

Une autre option, et celle que je préfère, serait de définir la classe interne sur statique.

public static class ThreadTask implements Runnable { ... }
DanO
la source
A parfaitement fonctionné pour moi aussi. Je pense que cela devrait être la solution préférée car 1) C'est la plus simple et 2) La méthode principale est statique.
Alan
15

Créez la classe en ligne static.

public class OuterClass {

    static class InnerClass {
    }

    public InnerClass instance = new OuterClass.InnerClass();
}

Ensuite, vous pouvez instancier la classe interne comme suit:

new OuterClass.InnerClass();
kangear
la source
3

Faites cette structure:

FICHIER GeoLocation.java

public class GeoLocation {

    public static void main(String[] args) throws InterruptedException {

        int size = 10;

        // create thread pool with given size
        ExecutorService service = Executors.newFixedThreadPool(size); 

        // queue some tasks
        for(int i = 0; i < 3 * size; i++) {
            service.submit(new ThreadTask(i));
        }

        // wait for termination        
        service.shutdown();
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 
    }

}

Fichier ThreadTask.java

public class ThreadTask implements Runnable {
    private int id;

    public ThreadTask(int id) {
        this.id = id;
    }

    public void run() {
        System.out.println("I am task " + id);
    }
}
Rafael Pereira
la source
4
Bienvenue sur SO, ici, c'est une bonne pratique d'expliquer pourquoi utiliser votre solution et pas seulement comment. Cela rendra votre réponse plus précieuse et aidera le lecteur à mieux comprendre comment vous le faites. Je vous suggère également de consulter notre FAQ: stackoverflow.com/faq .
ForceMagic
2

Vous devez créer une instance de la classe parent afin de créer des instances de vos classes internes. Voici un exemple:

package RandomTests;

public class FinalConstructorTest {


    public static void main (String [] arg){
        FinalConstructorTest fct= new FinalConstructorTest();
        InnerClass1 f1= fct.new InnerClass1(99);
        InnerClass2 f2= fct.new InnerClass2();
    }

    class InnerClass1{
        private final int num2;

        protected InnerClass1(int num){
            num2= num;
            System.out.println("num2= "+ num2);
        }
    }
    class InnerClass2{
        //private static final int x; //Doesn't work
        private final int y; 

        {
            y= 5;
            System.out.println("y= "+ y);
        }
    }
}
Gène
la source
1

Cela peut également se produire si vous accédez à des membres non statiques à partir des méthodes statiques ou de la même manière. Voici deux aspects différents, l'un qui cause l'erreur et l'autre un morceau de code résolu. c'est juste la question de rendre autre comme classe "statique"

package Stack;

import java.util.Stack;
import java.util.*;

public class StackArrList {

    public static void main(String[] args) {


        Scanner in = new Scanner(System.in);

        Stack S = new Stack();
        System.out.println("Enter some integers and keep 0 at last:\n");
        int n = in.nextInt();

        while (n != 0) {
            S.push(n);
            n = in.nextInt();
        }
        System.out.println("Numbers in reverse order:\n");

        while (!S.empty()) {

            System.out.printf("%d", S.pop());
            System.out.println("\n");

        }

    }

    public class Stack {
        final static int MaxStack = 100;
        final static int Value = -999999;
        int top = -1;
        int[] ST = new int[MaxStack];

        public boolean empty() {
            return top == -1;
        }

        public int pop() {

            if (this.empty()) {
                return Value;
            }
            int hold = ST[top];
            top--;
            return hold;
        }

        public void push(int n) {
            if (top == MaxStack - 1) {
                System.out.println("\n Stack Overflow\n");
                System.exit(1);
            }
            top++;
            ST[top] = n;

        }

    }

}

Cela génère l'erreur Aucune instance englobante de type StackArrList n'est accessible. Doit qualifier l'allocation avec une instance englobante de type StackArrList (par exemple, xnew A () où x est une instance de StackArrList). et ne permettra pas de créer une instance de la classe Stack

Lorsque vous transformez la classe Stack en classe statique, Stack fonctionnera correctement et aucune erreur ne sera présente.

package Stack;

import java.util.Stack;
import java.util.*;

public class StackArrList {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        Stack S = new Stack();
        System.out.println("Enter some integers and keep 0 at last:\n");
        int n = in.nextInt();

        while (n != 0) {
            S.push(n);
            n = in.nextInt();
        }
        System.out.println("Numbers in reverse order:\n");

        while (!S.empty()) {

            System.out.printf("%d", S.pop());
            System.out.println("\n");

        }

    }

    static class Stack {
        final static int MaxStack = 100;
        final static int Value = -999999;
        int top = -1;
        int[] ST = new int[MaxStack];

        public boolean empty() {
            return top == -1;
        }

        public int pop() {

            if (this.empty()) {
                return Value;
            }
            int hold = ST[top];
            top--;
            return hold;
        }

        public void push(int n) {
            if (top == MaxStack - 1) {
                System.out.println("\n Stack Overflow\n");
                System.exit(1);
            }
            top++;
            ST[top] = n;

        }

    }

}
Gaurav Karia
la source