Harus memenuhi syarat alokasi dengan contoh yang melingkupi tipe GeoLocation


109

Saya mendapatkan kesalahan ini sebagai-

Tidak ada contoh penutup dari tipe GeoLocation yang dapat diakses. Harus memenuhi syarat alokasi dengan contoh yang melingkupi tipe GeoLocation (egxnew A () di mana x adalah turunan dari GeoLocation). Kesalahan ini datang di ThreadTask baru (i) . Saya tidak tahu mengapa itu terjadi. Setiap saran akan dihargai.

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);
        }
    }

}


Jawaban:


150

Hai, saya menemukan solusi untuk ini ;-)

Kesalahan ini terjadi karena Anda mencoba membuat instance kelas dalam service.submit(new ThreadTask(i)); tanpa membuat instance kelas utama ..

Untuk mengatasi masalah ini, harap buat instance kelas utama terlebih dahulu:

GeoLocation outer = new GeoLocation();

Kemudian buat instance kelas yang ingin Anda panggil, sebagai berikut:

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

Saya harap ini akan menyelesaikan masalah Anda ;-)


101

Pilihan lain, dan yang saya suka, akan mengatur kelas dalam menjadi statis.

public static class ThreadTask implements Runnable { ... }

Bekerja dengan sempurna untuk saya juga. Saya pikir ini harus menjadi solusi yang disukai karena 1) Ini adalah yang paling sederhana dan 2) Metode utamanya adalah statis.
Alan

15

Buat kelas sebaris static.

public class OuterClass {

    static class InnerClass {
    }

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

Kemudian Anda dapat membuat instance kelas dalam sebagai berikut:

new OuterClass.InnerClass();

3

Lakukan Struktur ini:

MENGAJUKAN 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); 
    }

}

Mengajukan 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);
    }
}

4
Selamat datang di SO, ini adalah praktik yang baik untuk menjelaskan mengapa menggunakan solusi Anda dan bukan hanya bagaimana. Itu akan membuat jawaban Anda lebih berharga dan membantu pembaca lebih lanjut untuk memiliki pemahaman yang lebih baik tentang bagaimana Anda melakukannya. Saya juga menyarankan agar Anda melihat FAQ kami: stackoverflow.com/faq .
ForceMagic

2

Anda perlu membuat instance dari kelas induk untuk membuat instance dari kelas dalam Anda. Berikut ini contohnya:

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);
        }
    }
}

1

Ini dapat terjadi juga jika Anda mengakses anggota non-statis dari metode statis atau juga. Berikut adalah dua aspek yang berbeda, satu yang menyebabkan kesalahan dan bagian kode lainnya yang terpecahkan. itu hanya masalah menjadikan kelas lain sebagai "statis"

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;

        }

    }

}

Ini melempar kesalahan Tidak ada contoh penutup tipe StackArrList yang dapat diakses. Harus memenuhi syarat alokasi dengan contoh penutup dari tipe StackArrList (egxnew A () di mana x adalah turunan dari StackArrList). dan tidak akan mengizinkan untuk membuat instance dari kelas Stack

Saat Anda membuat kelas Tumpukan ke kelas statis, Tumpukan akan berfungsi dengan baik dan tidak akan ada kesalahan di sana.

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;

        }

    }

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.