2017-08-09 3 views
0

Wenn ich einen Getter verwende, um den Wert eines Arrays zurückzugeben, deklariert er null. Dies tritt jedoch nicht auf, wenn ich das Array außerhalb des Klassenkonstruktors definiere, da es leider durch eine for-Schleife im Konstruktor definiert sein muss. Der Getter:Getter für Java-Array gibt null zurück

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

Die for-Schleife, die das Array definiert:

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]; 

Die Schleife wurden, ist es in der anderen Klasse 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); 
    } 

Die gesamte "Dice" class bei Bedarf:

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

Sie möchten wahrscheinlich den Code anzeigen, der den Getter tatsächlich aufruft. – ChiefTwoPencils

+2

'dispLetter' ist statisch. Seine Initialisierung ist nicht. Das ist generell ein schlechtes Zeichen. Es sieht so aus, als ob "dispLetter" nicht an erster Stelle statisch sein sollte, oder die Initialisierung muss in einen statischen Initialisierungsblock verschoben werden. –

+0

Sie iterieren 'dice []' und setzen 1-16 Zahlen, die bereits 1-16 Zahlen haben. dort gab es eine Arbeitsentlastung. – msagala25

Antwort

2

Es ist im Allgemeinen keine gute Idee, ein statisches Element in einem Konstruktor zu initialisieren. Sie verweisen auf dispLetter, bevor es im Dice()-Konstruktor initialisiert wurde. Entfernen Sie die static Modifikator aus dispLetter und seine Getter-Methode

Dann sollte der Code nach dieser Änderung funktionieren:

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

mit

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

ODER
Wenn Sie wirklich denken dispLetter sollte static bleiben, dann den Code verschieben im Konstruktor zu einem statischen initialzer-Block:

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

Vielen Dank! Das hat tatsächlich funktioniert – bpfuels