2017-01-02 7 views
1

makeLineメソッドが何とかヌル配列を作成した疑いがありますが、わかりません。Android:nullpointerexceptionヌル配列から読み取ろうとしました

ご協力いただければ幸いです!私のコードの抜粋は以下の通りです:

public void all() { 

     int[][] line = new int[3][]; 

     for (int i = 0; i < 3; i++) { 
      if (i > 0 && line[i - 1][0] == 2) { // Error occurs at this line 
       int start = line[i - 1][2]; 
       int pos = line[i - 1][1]; 
       int xy = line[i - 1][3]++; 

       if (line[i - 1][3] == 1) { 
        int end = y()[1]; 
        line[i] = new int[]{1, start, end, pos, xy}; 
       } else { 
        int end = x()[1]; 
        line[i] = new int[]{1, start, end, pos, xy}; 
       } 
      } else { 
       line[i] = makeLine(); 
      } 
     } 
} 

private int[] makeLine() { 
       Random r = new Random(); 

       int startX = x()[0]; 
       int endX = x()[1]; 
       int startY = y()[0]; 
       int endY = y()[1]; 

       int xy = r.nextInt(3 - 1) + 1; 

       if (xy == 1) { 
        return new int[]{1, startX, endX, startY, xy}; 
       } 

       return new int[]{1, startY, endY, startX, xy}; 
      } 

private int[] x() { 
     DisplayMetrics displaymetrics = context.getResources().getDisplayMetrics(); 
     int xLeft = (int) (13 * displaymetrics.density); 
     int xRight = (int) (displaymetrics.widthPixels - (13 * displaymetrics.density)); 

     Random r = new Random(); 
     int startX = r.nextInt(xRight - xLeft) + xLeft; 
     int endX = r.nextInt(xRight - xLeft) + xLeft; 

     return new int[]{startX, endX}; 
    } 

private int[] y() { 
     DisplayMetrics displaymetrics = context.getResources().getDisplayMetrics(); 
     int yTop = (int) (60 * displaymetrics.density); 
     int yBottom = (int) (displaymetrics.heightPixels - (51 * displaymetrics.density)); 

     Random r = new Random(); 
     int startY = r.nextInt(yBottom - yTop) + yTop; 
     int endY = r.nextInt(yBottom - yTop) + yTop; 

     return new int[]{startY, endY}; 
    } 
+1

にあなたが取得している完全なエラー/スタックトレースを投稿することができますか? –

+0

私はここにあなたを助けるのに十分な情報がないと思います。私たちが実行できる完全な例を私たちに提供する必要があります。現時点では、いくつかのメソッド(例えば、 'x()'と 'y()')が欠落しているため、これは不可能です。 –

答えて

0

私はあなたが配列の境界外の要素への参照をしたので、あなたはNULLポインタを取得していると思います。

if (i > 0 && line[i][0] == 2) { 

の代わりに::

if (i > 0 && line[i - 1][0] == 2) 

すべてこのプログラムの上にこれと同様のミスがありますが、上のエラーを得たの行は次のようになります。配列はインデックスが0ではなく1で始まることを覚えておいてください。

+0

メモリが割り当てられていれば、line [i-1] [0]へのアクセス、またはline [i] [0]へのアクセスには何も問題ありません。 – yakobom

1

初期化される前に[0] [0]にアクセスしようとしたために例外があります。これにより

:あなたが唯一この多次元配列のために1次元を作成している

int[][] line = new int[3][]; 

。これを行う方法のいずれかである:

int[][] line = new int[3][SOME_NUMBER]; 

または明示的にそれぞれの行を初期化する:

int[][] line = new int[3][]; 
for (int i = 0; i < 3; i++) { 
    line[i] = new int[SOME_NUMBER]; 
} 

あなたはそれをよりよく理解する必要がある場合は、例えば、ここを見て:[多次元配列をJavaの

] 1

関連する問題