2017-08-09 26 views
0

ゲッターを使用して配列の値を返すと、nullが宣言されます。しかし、クラスコンストラクタの外側に配列を定義すると、これは発生しません。残念なことに、コンストラクタ内にある必要があるforループによって定義されています。 ゲッター:配列を定義forループgetter for java array nullを返します

public static String[] getLetters(){ 
    return dispLetter; 
} 

ザ:

for(int i=0; i<16; i++){ 
     int letterSelect = (int) (Math.random()*6+1); 
     System.out.print(letterSelect+","); 
     dispLetter[i]=letters[dice[i]-1][letterSelect-1]; 

ループは、それが他のクラスにrefrencedされた:

for(int i=0; i<16;i++){ 
     grid[i]=new JLabel(" "+Dice.getLetters()[i]+" "); 
     grid[i].setFont(new Font("Arial", Font.BOLD, 68)); 
     grid[i].setHorizontalAlignment(SwingConstants.CENTER); 
     grid[i].setVerticalAlignment(SwingConstants.CENTER); 
    } 

全体の "ダイス" クラス必要に応じて:

package excersize.pkg9; 

import java.util.Random; 

public class Dice { 
    private static String dispLetter[] = new String[16]; 

    public Dice() { 
     int dice[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 

     for (int i = 0; i < dice.length; i++) { 
      dice[i] = i + 1; 
     } 

     Random rnd = new Random(); 

     for (int i = 0; i < dice.length; i++) { 
      int changeBy = rnd.nextInt(dice.length); 
      int value = dice[i]; 
      dice[i] = dice[changeBy]; 
      dice[changeBy] = value; 
     } 

     for (int i = 0; i < dice.length; i++) { 
      System.out.print(dice[i] + ","); 
     } 

     String letters[][] = new String[][]{ 
       {"A","F","P","K","F","S"}, 
       {"E","T","T","R","L","Y"}, 
       {"D","E","Y","L","V","R"}, 
       {"C","P","O","H","A","S"}, 
       {"I","Y","S","D","T","T"}, 
       {"N","E","E","H","G","W"}, 
       {"R","N","Z","N","L","H"}, 
       {"R","D","I","X","E","L"}, 
       {"Qu","N","M","I","H","U"}, 
       {"T","S","E","I","S","O"}, 
       {"T","T","O","A","O","W"}, 
       {"V","T","H","R","W","E"}, 
       {"S","I","E","N","E","U"}, 
       {"T","U","I","C","O","M"}, 
       {"B","O","A","J","O","B"}, 
       {"G","A","E","A","N","E"}, 
     }; 

     System.out.println(); 

     for(int i=0; i<16; i++){ 
      int letterSelect = (int) (Math.random()*6+1); 
      System.out.print(letterSelect+","); 
      dispLetter[i]=letters[dice[i]-1][letterSelect-1]; 
     } 

     System.out.println(); 

     for(int i=0; i<dispLetter.length; i++){ 
      System.out.print(dispLetter[i]+","); 
     } 
    } 

    public static String[] getLetters(){ 
     return dispLetter; 
    } 
} 
+0

実際にゲッターを起動するコードを表示したいと思うかもしれません。 – ChiefTwoPencils

+2

'dispLetter'は静的です。初期化はできません。それは一般的に悪い兆候です。 'dispLetter'は最初は静的であってはならないか、初期化は静的初期化子ブロックに移動する必要があります。 –

+0

あなたは 'dice []'を繰り返し実行し、すでに1-16の数字を持つ1-16の数字を入れます。作業の冗長性がそこで発生しました。 – msagala25

答えて

2

コンストラクタ内の静的メンバーを初期化するのは一般的には良い考えではありません。 Dice()コンストラクタで初期化される前に、dispLetterを参照しています。その後dispLetterとそのgetterメソッド

からstatic修飾子を削除し、コードがこの変更後に正常に動作する必要があります:
あなた場合

grid[i]=new JLabel(" "+(new Dice().getLetters()[i])+" "); 

OR

grid[i]=new JLabel(" "+Dice.getLetters()[i]+" "); 

を交換してください本当にdispLetterstaticのままにして、コードを移動する必要があります

static { 
int dice[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
    for (int i = 0; i < dice.length; i++) { 
     dice[i] = i + 1; 
    } 
    Random rnd = new Random(); 
    for (int i = 0; i < dice.length; i++) { 
     int changeBy = rnd.nextInt(dice.length); 
     int value = dice[i]; 
     dice[i] = dice[changeBy]; 
     dice[changeBy] = value; 
    } 
    for (int i = 0; i < dice.length; i++) { 
     System.out.print(dice[i] + ","); 
    } 

    String letters[][] = new String[][]{ 
      {"A","F","P","K","F","S"}, 
      {"E","T","T","R","L","Y"}, 
      {"D","E","Y","L","V","R"}, 
      {"C","P","O","H","A","S"}, 
      {"I","Y","S","D","T","T"}, 
      {"N","E","E","H","G","W"}, 
      {"R","N","Z","N","L","H"}, 
      {"R","D","I","X","E","L"}, 
      {"Qu","N","M","I","H","U"}, 
      {"T","S","E","I","S","O"}, 
      {"T","T","O","A","O","W"}, 
      {"V","T","H","R","W","E"}, 
      {"S","I","E","N","E","U"}, 
      {"T","U","I","C","O","M"}, 
      {"B","O","A","J","O","B"}, 
      {"G","A","E","A","N","E"}, 

    }; 

    System.out.println(); 
    for(int i=0; i<16; i++){ 
     int letterSelect = (int) (Math.random()*6+1); 
     System.out.print(letterSelect+","); 
     dispLetter[i]=letters[dice[i]-1][letterSelect-1]; 
    } 
    System.out.println(); 
    for(int i=0; i<dispLetter.length; i++){ 
     System.out.print(dispLetter[i]+","); 
    } 
    } 

public Dice() { 
} 
+0

ありがとう!これは実際に働いた – bpfuels

関連する問題