2016-11-22 9 views
1

現在のところ、このコードは完成していません。私は、各スペースに異なる1桁の数字を持つ3x3配列をランダムに生成するのに必要なメソッドを書いています。しかし、最初の行にはInternal compiler error: java.lang.NullPointerException at org.eclipse.jdt.internal.compiler.ast.ReferenceExpression.copy(ReferenceExpression.java:141)というエラーが表示されます。私は本当にこのエラーが何を意味するか分からない、私は繁栄プログラマーだから。このエラーを修正するにはどうすればよいですか?内部コンパイラエラー?

public class MagicSquare { 
    public static void main(String[] args) { 

    } 

    public static int sumRows(int[][] array) { 
     int totalRowOne; 
     int totalRowTwo; 
     int totalRowThree; 

     totalRowOne = array[0][0] + array[0][1] + array[0][2]; 
     totalRowTwo = array[1][0] + array[1][1] + array[1][2]; 
     totalRowThree = array[2][0] + array[2][1] + array[2][2]; 

     if(totalRowOne == totalRowTwo && totalRowOne == totalRowThree) { 
      return totalRowOne; 
     } 
     else { 
      return -1; 
     } 
    } 

    public static int sumColumns(int[][] array) { 
     int totalColumnOne; 
     int totalColumnTwo; 
     int totalColumnThree; 

     totalColumnOne = array[0][0] + array[1][0] + array[2][0]; 
     totalColumnTwo = array[0][1] + array[1][1] + array[2][0]; 
     totalColumnThree = array[0][2] + array[1][2] + array[2][2]; 

     if(totalColumnOne == totalColumnTwo && totalColumnOne == totalColumnThree) { 
      return totalColumnOne; 
     } 
     else { 
      return -1; 
     } 
    } 

    public static int sumDiagonals(int[][] array) { 
     int totalDiagonalOne; 
     int totalDiagonalTwo; 

     totalDiagonalOne = array[0][0] + array[1][1] + array[2][2]; 
     totalDiagonalTwo = array[0][2] + array[1][1] + array[2][0]; 

     if(totalDiagonalOne == totalDiagonalTwo) { 
      return totalDiagonalOne; 
     } 
     else { 
      return -1; 
     } 
    } 

    public static boolean isUnique(int[][] array, int num) { 
     if(num == array[0][0] || num == array[0][1] || num == array[0][2] || 
      num == array[1][0] || num == array[1][1] || num == array[1][2] || 
      num == array[2][0] || num == array[2][1] || num == array[2][2]) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

    public static void displayMagicSquare(int[][] array) { 
     int counter1; 
     int counter2; 

     for(counter1 = 0; counter1 < 3; counter1++) { 
      for(counter2 = 0; counter2 < 3; counter2++) { 
       System.out.print(array[counter1][counter2]); 
      } 
      System.out.print("/n"); 
     } 
    } 

    public static int[][] fillMatrix(int[][] array) { 
     int numberOne; 
     int numberTwo; 
     int numberThree; 
     int numberFour; 
     int numberFive; 
     int numberSix; 
     int numberSeven; 
     int numberEight; 
     int numberNine; 

     array[0][0] = 0; 
     array[0][1] = 0; 
     array[0][2] = 0; 
     array[1][0] = 0; 
     array[1][1] = 0; 
     array[1][2] = 0; 
     array[2][0] = 0; 
     array[2][1] = 0; 
     array[2][2] = 0; 

     numberOne = (int)(Math.random() * 8 + 1); 
     do { 
      numberTwo = (int)(Math.random() * 8 + 1); 
     } while(numberTwo == numberOne); 

     do { 
     numberThree = (int)(Math.random() * 8 + 1); 
     } while(numberThree == numberTwo || numberThree == numberOne); 

     do { 
     numberFour = (int)(Math.random() * 8 + 1); 
     } while(numberFour == numberThree || numberFour == numberTwo || numberFour == numberOne); 

     do {  
     numberFive = (int)(Math.random() * 8 + 1); 
     } while (numberFive == numberFour || numberFive == numberThree || numberFive == numberTwo || 
       numberFive == numberOne); 

     do { 
     numberSix = (int)(Math.random() * 8 + 1); 
     } while(numberSix == numberFive || numberSix == numberFour || numberSix == numberThree || 
       numberSix == numberTwo ||numberSix == numberOne); 

     do { 
     numberSeven = (int)(Math.random() * 8 + 1); 
     } while(numberSeven == numberSix || numberSeven == numberFive || numberSeven == numberFour || 
       numberSeven == numberThree ||numberSeven == numberTwo ||numberSeven == numberOne); 

     do { 
     numberEight = (int)(Math.random() * 8 + 1); 
     } while(numberEight == numberSeven || numberEight == numberSix || numberEight == numberFive || 
       numberEight == numberFour ||numberEight == numberThree ||numberEight == numberTwo || 
       numberEight == numberOne); 

     do { 
     numberNine = (int)(Math.random() * 8 + 1); 
     } while(numberNine == numberEight || numberNine == numberSeven || numberNine == numberSix || 
       numberNine == numberFive || numberNine == numberFour ||numberNine == numberThree || 
       numberNine == numberTwo || numberNine == numberOne); 

     array[0][0] = numberOne; 
     array[0][1] = numberTwo; 
     array[0][2] = numberThree; 
     array[1][0] = numberFour; 
     array[1][1] = numberFive; 
     array[1][2] = numberSix; 
     array[2][0] = numberSeven; 
     array[2][1] = numberEight; 
     array[2][2] = numberNine; 

     return array; 
    } 

    public static boolean isMagicSquare(int[][] array) { 
     if(sumRows(int[][] array) == sumColumns(int[][] array) && sumColumns(int[][] array) == sumDiagonals(int[][] array)) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

} 
+0

dupではなく、Eclipseのバグのようです。 –

+1

Jay、Eclipseの最新バージョンを使用していることを確認してください。 –

答えて

0

コードにいくつかのコンパイルの問題がありました。また、コードは以下のコードスニペットの無限ループに入ります。 Math.random()は、1未満の値を生成します。Math.random()が最大値を0.999として生成するとしたら、(Math.random() * 8)の結果は7.992となります。 (Math.random() * 8)の結果は決して8以上ではありません。(int) (Math.random() * 8 + 1)の最大値は、(Math.random() * 8)の四捨五入ではないため、8より大きくなることはありません。整数に変換された場合は7になります。

do { 
    numberNine = (int) (Math.random() * 8 + 1); 
} while(numberNine == numberEight || numberNine == numberSeven || numberNine == numberSix || numberNine == numberFive || numberNine == numberFour || numberNine == numberThree || numberNine == numberTwo || numberNine == numberOne); 

私は、問題があなたの場合と同じであるかどうかを確認していないこのようなエラーhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=482737のための参照を発見しました。

コンパイルして正常に実行するコードをいくつか変更しました。

public class MagicSquare { 
    public static void main(String[] args) { 
     int[][] array = new int[3][3]; 
     fillMatrix(array); 
     System.out.println("Is magical square:" + isMagicSquare(array)); 
     displayMagicSquare(array); 
     System.out.println("Is number present:" + isUnique(array, 1)); 
    } 

    private static int sumRows(int[][] array) { 
     int totalRowOne; 
     int totalRowTwo; 
     int totalRowThree; 

     totalRowOne = array[0][0] + array[0][1] + array[0][2]; 
     totalRowTwo = array[1][0] + array[1][1] + array[1][2]; 
     totalRowThree = array[2][0] + array[2][1] + array[2][2]; 

     if(totalRowOne == totalRowTwo && totalRowOne == totalRowThree) { 
      return totalRowOne; 
     } else { 
      return -1; 
     } 
    } 

    private static int sumColumns(int[][] array) { 
     int totalColumnOne; 
     int totalColumnTwo; 
     int totalColumnThree; 

     totalColumnOne = array[0][0] + array[1][0] + array[2][0]; 
     totalColumnTwo = array[0][1] + array[1][1] + array[2][0]; 
     totalColumnThree = array[0][2] + array[1][2] + array[2][2]; 

     if(totalColumnOne == totalColumnTwo && totalColumnOne == totalColumnThree) { 
      return totalColumnOne; 
     } else { 
      return -1; 
     } 
    } 

    private static int sumDiagonals(int[][] array) { 
     int totalDiagonalOne; 
     int totalDiagonalTwo; 

     totalDiagonalOne = array[0][0] + array[1][1] + array[2][2]; 
     totalDiagonalTwo = array[0][2] + array[1][1] + array[2][0]; 

     if(totalDiagonalOne == totalDiagonalTwo) { 
      return totalDiagonalOne; 
     } else { 
      return -1; 
     } 
    } 

    private static boolean isUnique(int[][] array, int num) { 
     if(num == array[0][0] || num == array[0][1] || num == array[0][2] || num == array[1][0] || num == array[1][1] || num == array[1][2] || num == array[2][0] || num == array[2][1] || num == array[2][2]) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    private static void displayMagicSquare(int[][] array) { 
     int counter1; 
     int counter2; 

     for(counter1 = 0; counter1 < 3; counter1++) { 
      for(counter2 = 0; counter2 < 3; counter2++) { 
       System.out.print(array[counter1][counter2] + "\t"); 
      } 
      System.out.print("\n"); 
     } 
    } 

    private static int[][] fillMatrix(int[][] array) { 
     int numberOne; 
     int numberTwo; 
     int numberThree; 
     int numberFour; 
     int numberFive; 
     int numberSix; 
     int numberSeven; 
     int numberEight; 
     int numberNine; 

     array[0][0] = 0; 
     array[0][1] = 0; 
     array[0][2] = 0; 
     array[1][0] = 0; 
     array[1][1] = 0; 
     array[1][2] = 0; 
     array[2][0] = 0; 
     array[2][1] = 0; 
     array[2][2] = 0; 

     numberOne = (int) (Math.random() * 8 + 1); 
     do { 
      numberTwo = (int) (Math.random() * 8 + 1); 
     } while(numberTwo == numberOne); 

     do { 
      numberThree = (int) (Math.random() * 8 + 1); 
     } while(numberThree == numberTwo || numberThree == numberOne); 

     do { 
      numberFour = (int) (Math.random() * 8 + 1); 
     } while(numberFour == numberThree || numberFour == numberTwo || numberFour == numberOne); 

     do { 
      numberFive = (int) (Math.random() * 8 + 1); 
     } while(numberFive == numberFour || numberFive == numberThree || numberFive == numberTwo || numberFive == numberOne); 

     do { 
      numberSix = (int) (Math.random() * 8 + 1); 
     } while(numberSix == numberFive || numberSix == numberFour || numberSix == numberThree || numberSix == numberTwo || numberSix == numberOne); 

     do { 
      numberSeven = (int) (Math.random() * 8 + 1); 
     } while(numberSeven == numberSix || numberSeven == numberFive || numberSeven == numberFour || numberSeven == numberThree || numberSeven == numberTwo || numberSeven == numberOne); 

     do { 
      numberEight = (int) (Math.random() * 8 + 1); 
     } while(numberEight == numberSeven || numberEight == numberSix || numberEight == numberFive || numberEight == numberFour || numberEight == numberThree || numberEight == numberTwo || numberEight == numberOne); 

     do { 
      numberNine = (int) (Math.random() * 8 + 2); 
     } while(numberNine == numberEight || numberNine == numberSeven || numberNine == numberSix || numberNine == numberFive || numberNine == numberFour || numberNine == numberThree || numberNine == numberTwo || numberNine == numberOne); 

     array[0][0] = numberOne; 
     array[0][1] = numberTwo; 
     array[0][2] = numberThree; 
     array[1][0] = numberFour; 
     array[1][1] = numberFive; 
     array[1][2] = numberSix; 
     array[2][0] = numberSeven; 
     array[2][1] = numberEight; 
     array[2][2] = numberNine; 

     return array; 
    } 

    private static boolean isMagicSquare(int[][] array) { 
     if(sumRows(array) == sumColumns(array) && sumColumns(array) == sumDiagonals(array)) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
} 
+0

なぜその行は無限ループになりますか?最終的にまだ使用されていなかった1から9までの最後の番号を生成し、その番号を入力しませんか? –

+0

Math.random()は1より小さい値を生成します。最大値を0.999として生成すると、(Math.random()* 8)の結果は7.992になります。 max(int)(Math.random()* 8 + 1)は、(Math.random()* 8)を丸めていないので、8を超えることはありません。あなたがまだ明確でない場合は、私にお知らせください。 –

+0

私の答えにも同じ説明が追加されました。 –

0
Internal compiler error: java.lang.NullPointerException at org.eclipse.jdt.internal.compiler.ast.ReferenceExpression.copy(ReferenceExpression.java:141) 

EclipseのJavaコンパイラの実際の内部根性が彼らはNULLポインタを間接参照するように混乱しましたことを意味します。これは定義上、Eclipseのバグです。おそらく、あなたのコードの何らかのエラーのためにこのバグが起きたでしょう。小さく正確なJavaクラスがこれらのうちの1つに当てはまると、非常に驚​​くべきことです。

実際のJDKでコードをコンパイルしてみることができます。修正する必要があることを示す可能性があります。一般に、唯一のビルドツールとしてIDEを使用すべきではありません。ある日、コマンドラインから繰り返し可能なビルドをしたいと思うでしょう。あなたはant、Maven、またはgradleを学びたいでしょう。おそらく、さまざまなコンパイル用Webサイトの1つが、あなたの即座のニーズに便利かもしれません。

関連する問題