이 오류가 발생합니다.
GeoLocation 유형의 둘러싸는 인스턴스에 액세스 할 수 없습니다. GeoLocation 유형의 둘러싸는 인스턴스 (예 : x는 GeoLocation의 인스턴스)로 할당을 한정해야합니다. 이 오류는 new ThreadTask (i)에서 발생 합니다. 왜 그런지 모르겠습니다. 모든 제안을 주시면 감사하겠습니다.
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);
}
}
}
답변
안녕하세요 저는 이것에 대한 해결책을 찾았습니다 😉
이 오류 service.submit(new ThreadTask(i));
는 기본 클래스의 인스턴스를 만들지 않고 내부 클래스의 인스턴스를 만들려고하기 때문에 발생합니다 .
이 문제를 해결하려면 먼저 기본 클래스의 인스턴스를 만드십시오.
GeoLocation outer = new GeoLocation();
그런 다음 다음과 같이 호출하려는 클래스의 인스턴스를 만듭니다.
service.submit(outer.new ThreadTask(i));
문제가 해결되기를 바랍니다 .-)
답변
내가 선호하는 또 다른 옵션은 내부 클래스를 정적으로 설정하는 것입니다.
public static class ThreadTask implements Runnable { ... }
답변
인라인 클래스를 만듭니다 static
.
public class OuterClass {
static class InnerClass {
}
public InnerClass instance = new OuterClass.InnerClass();
}
그런 다음 다음과 같이 내부 클래스를 인스턴스화 할 수 있습니다.
new OuterClass.InnerClass();
답변
이 구조를하십시오 :
파일 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);
}
}
파일 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);
}
}
답변
내부 클래스의 인스턴스를 만들려면 부모 클래스의 인스턴스를 만들어야합니다. 다음은 예입니다.
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);
}
}
}
답변
정적 메서드 또는 마찬가지로 비 정적 멤버에 액세스하는 경우에도 발생할 수 있습니다. 다음은 오류를 일으키는 두 가지 측면과 다른 해결 된 코드 부분입니다. 다른 클래스를 “정적”으로 만드는 문제입니다.
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;
}
}
}
이 경우 StackArrList 유형의 엔 클로징 인스턴스에 액세스 할 수 없음 오류가 발생 합니다. StackArrList 유형의 엔 클로징 인스턴스로 할당을 한정해야합니다 (예 : x는 StackArrList의 인스턴스 인 경우 xnew A ()). 스택 클래스의 인스턴스를 만들 수 없습니다.
스택 클래스 를 정적 클래스 스택으로 만들면 정상적으로 작동하고 오류가 발생하지 않습니다.
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;
}
}
}