2016-10-02 7 views
0

問題私は、以下の方法で非静的コンテキストの配列を倍増しようとしているとき、非静的

public class Test { 
    int[] data=new int[1]; 

    public void Double(){ 
     if(data == null){ 
      int[] data=new int[1]; 
     } 
     int[] data=new int[data.length*2]; 
    } 

    public static void main(String[] args){ 
     Test table = new Test(); 
     table.data=new int[1]; 
    } 
} 

それは

ことを私に警告するためのjavacがそれをコンパイルしません

変数のデータは、それは明らかに初期化されているにもかかわらず

を初期化されていない可能性があります、どのように私はこの問題を回避することができますか?

答えて

2

Double()のローカル変数dataを宣言しています(実際にはそのような変数を2つ宣言しています)。同じ名前のインスタンス変数を非表示にしています。

したがって、声明の中で:

int[] data=new int[data.length*2]; 

あなたはローカル変数datadata.lengthにアクセスしている初期化されます。

に変更し、それを:

public void Double(){ 
    if(data == null){ 
     data=new int[1]; 
    } else { 
     data=new int[data.length*2]; 
    } 
} 
+0

申し訳ありませんが、あまりにも表面的に読んでいたとスープでフライを見つけるしようとしていた。 –

+0

@Eranそれは 'Test'と呼ばれていたはずです。 'double'はキーワードであり、したがって識別子ではないので、正当なメソッド名ではありません。 – EJP

+0

@EJP私はそれについて考えなかった。しかし、このメソッドの目的はメンバ配列の長さを2倍にすることであるため、おそらく 'doubleArray()'がうまく適合します。それはコンストラクタではないので、クラスと同じ名前で呼び出すことも混乱していたでしょう。 – Eran

0

あなたのコードが完全に無意味です。 dataは、テストする時点でnullになることはありません。また、すぐにスコープから外れるローカル変数を宣言して初期化する次の行も同様に意味がないので、関連するコードはすべて削除できます。

関連する問題