2012-04-29 6 views
2

メインメソッドでRunnableインターフェイスを実装し、それらのオブジェクトをスレッドプールに渡すクラスのオブジェクトを作成しようとしています。しかし、IDEはという非静的変数を読み取るエラーを表示します。これは静的コンテキストから参照できません。すなわち、最初にオブジェクトを作成できませんでした。私はこのコードで何が間違っているのか理解できませんでした。他のすべては正常に動作しますが、このコード行はコンパイルエラーを示しています。 誰でも手伝いできますか?そこRunnableインターフェイスを実装するクラスのオブジェクトを作成できません

package threads; 

import java.util.concurrent.*; 

public class Tut5 { 

    public static void main(String[] args) { 

     ExecutorService exe = Executors.newFixedThreadPool(2); 

     for(int i=0; i<5; i++) { 
      Runner5 r5 = new Runner5(i); 
      exe.submit(r5); 
     } 

     exe.shutdown(); 

     System.out.println("All tasks submitted."); 

     try { 
      exe.awaitTermination(1, TimeUnit.DAYS); 
     } 
     catch(InterruptedException e) { 
      e.printStackTrace(); 
     } 

     System.out.println("All tasks completed."); 
    } 

    class Runner5 implements Runnable { 

     private int id; 

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

     public void run() { 

      System.out.println("Starting thread: " + id); 

      try{ 
       Thread.sleep(3000); 
      } 
      catch(InterruptedException e) { 
       e.printStackTrace(); 
      } 

      System.out.println("Ending thread: " + id); 
     } 
    } 
} 

uが、これは静的なコンテキストから参照することはできません

+2

コードを見ずに誰もあなたを助けることができません。 – jtahlborn

答えて

2
  • 非静的変数を@jtahlborn行く -

あなたが静的でないインスタンスやメソッドを使用しているときにこのエラーが来ます静的メソッドまたはブロック。

メインメソッドは静的public static void main(String[] args)です。そのシンプルなエラーになります。

ここにあなたのclass Runner5 implements Runnableクラスは、それが生成するので、あなたは、静的なmainメソッドにアクセスしている内部クラスである -

No enclosing instance of type Tut5 is accessible. 
Must qualify the allocation with an enclosing instance of type Tut5 
(e.g. x.new A() where x is an instance of Tut5). 

あなたTut5クラスのうち、この内部クラスを定義するか、または静的としてこのRunner5をマークすることができます。 Tut5クラスのインスタンスを作成し、メソッドを作成して残りのコードを配置します。

ありがとうございます。

+0

いくつかのメソッドにコードを挿入し、インスタンスを作成して呼び出すことで、このエラーを回避できます。 –

+0

** for(int i = 0; i <5; i ++){ Runner5 r5 = new Runner5(i); } '** これはエラーを表示しているコードです。メインメソッドの中でオブジェクトを作成できないのはどうしてですか? –

+0

@ nick-s、私はあなたを得ていませんでした。エラーが発生した場合は、コードスニペットを親切に表示してください。ありがとう –

0

ここでの問題は、意図せずに内部クラスを作成したことです。あなたはJavaの初心者であり、内部クラスはかなり高度なJavaの機能なので、当面は避けるのが最良だと思います。

Javaに自信がなくなるまで、それぞれのクラスを別々のファイルに入れることをお勧めします。 Runner5クラスのコードを別のファイルに移動し、クラスpublicを作成し、Runner5.javaと名前を付けます。次に、コードが正常にコンパイルされることがわかります。

あなたのコードでは、作成するTut5の各インスタンスに属するクラスRunner5が定義されています。しかし、Tut5のインスタンスは決して作成されないので、それらに属しているRunner5を作成することはできません。 Runner5クラスにstatic修飾子を追加した場合、内部クラスRunner5は、このクラスのインスタンスの代わりにTut5クラスに属します。 mainメソッドの中からRunner5を作成することができます。しかし、あなたはまだJavaを学んでいるので、私は物事を単純に保ち、1つのファイルごとのルールに固執することをお勧めします。

+0

確かなこと@luke –

0

最も簡単な解決方法は、Runner5クラスを独自のファイルにコピーすることです。

非常に良い理由がない限り、なぜこのケースではネストされたクラスを使用する必要があるのか​​わかりませんが、あなたが示したコードでは何も変更されません。

2

Runner5クラスはクラスTut5です。したがって、外部インスタンスをインスタンス化する必要があります。

Runner5を静的クラスにすると、外部インスタンスを必要としないという静的ネストされたクラスになります。

static class Runner5 implements Runnable { 
... 
} 

しかし、他の人が指摘しているとして、あなたが入れ子になったクラスの運動に取り組んでいる、またはあなたはクラスがクラスとの組み合わせでのみ有用であることを確認している場合を除き、あなたは、独自のクラスファイルにクラスを置く必要がありますTut5であり、そのクラスからのみ参照されます。

Seee http://docs.oracle.com/javase/tutorial/java/javaOO/nested.htmlいくつかの洞察のために。

+0

歓声@christian –

関連する問題