2016-04-07 11 views
1

Wir versuchen, ein Spielbrett mit Kacheln (10 x 10) zu erstellen. Wenn wir die Klasse jedoch unten ausführen, erhalten wir weiterhin eine ArrayIndexOutOfBoundsException. Wenn diese Klasse auf einem anderen Gerät ausgeführt wird, wird dieser Fehler aus bestimmten Gründen nicht angegeben.Ausnahme im Thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 100

Board.java

public class Board extends JComponent { 

    public Board() { 

    } 


    public static String[] gameElements = new String[100]; 


    String[][] Map = new String[10][10]; 
    int positionX = 50; 
    int positionY = 50; 
    int i = 0; 
    String currentLevel = "1"; 

    @Override 
    public void paintComponent(Graphics g) { 
     loadLevel(); 
     for (int y = 0; y < Map.length; y++) { 
      for (int x = 0; x < Map.length; x++) { 
       new Tile(x, y).paintComponent(g); 
       Map[y][x] = gameElements[i]; 
       g.drawString(Map[y][x], positionY, positionX); 
       positionY = positionY + 50; 
       System.out.print("[" + Map[y][x] + "]"); 
       i++; 

      } 
      positionY = 50; 
      positionX = positionX + 50; 
      System.out.println(); 

     } 
    } 

    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     frame.setSize(600, 600); 
     frame.setTitle("SleutelBarricade"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JComponent chart = new Board(); 
     frame.add(chart); 

     frame.setVisible(true); 


    } 

    public void readTextFile(String fileName) { 
     try { 
      FileReader fileReader = new FileReader(fileName + ".txt"); 
      BufferedReader buffer = new BufferedReader(fileReader); 
      String splitBy = ","; 
      String line = buffer.readLine(); 

      for (int i = 0; i < gameElements.length; i++) { 
       gameElements = line.split(splitBy); 
      } 

     } catch (FileNotFoundException ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void loadLevel() { 
     readTextFile(currentLevel); 

    } 

} 

Ein Teil der Ausnahme:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 100 
    at Main.GameBoard.Board.paintComponent(Board.java:45) 
    at javax.swing.JComponent.paint(JComponent.java:1056) 
    at javax.swing.JComponent.paintChildren(JComponent.java:889) 
    at javax.swing.JComponent.paint(JComponent.java:1065) 
    at javax.swing.JComponent.paintChildren(JComponent.java:889) 
    at javax.swing.JComponent.paint(JComponent.java:1065) 
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:586) 
    at javax.swing.JComponent.paintChildren(JComponent.java:889) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217) 
+0

Sie setzen i nicht auf 0 zurück. Tun Sie dies am Anfang von paintComponent, bevor Sie die verschachtelte Schleife starten. – MichaelK

Antwort

0

Sie nie i zurücksetzen, bevor Sie Ihre Doppel verschachtelten Schleife beginnt. Verschieben Sie die Variable nach innen oder setzen Sie sie auf 0 zurück.

@Override 
public void paintComponent(Graphics g) { 
    int i = 0; 
    loadLevel(); 

    for (int y = 0; y < Map.length; y++) { 
     for (int x = 0; x < Map.length; x++) { 
      new Tile(x, y).paintComponent(g); 
      Map[y][x] = gameElements[i]; 
      g.drawString(Map[y][x], positionY, positionX); 
      positionY = positionY + 50; 
      System.out.print("[" + Map[y][x] + "]"); 
      i++; 

     } 

     positionY = 50; 
     positionX = positionX + 50; 
     System.out.println(); 
    } 
} 

ich auch empfehlen würden Sie Ihre Klasse neu zu organisieren, um es einfacher zu machen zu lesen. Sie müssen dem nicht genau folgen, sondern versuchen, ähnliche Dinge zu gruppieren. Dies wird Dinge besser hervorheben und anderen helfen, Ihrem Programm leichter zu folgen.

Mit dieser einfachen Tipp wäre die streunende int i = 0 (Instanzvariable) leicht zu erkennen gewesen.

public class Board extends JComponent { 
    // I. Static variables 
    public static String[] gameElements = new String[100]; 

    // II. Instance variables (These should be private or protected) 
    private String[][] map = new String[10][10]; 
    private int positionX = 50; 
    private int positionY = 50; 
    private int i = 0; // <------------------------- Hey, you don't belong here! 
    private String currentLevel = "1"; 

    // III. Getter/Setters 
    public String[] getMap() { 
     return map; 
    } 
    public void setMap(String[] map) { 
     this.map = map; 
    } 

    // IV. Constructor 
    public Board() { } 

    // V. Overrides 
    @Override 
    public void paintComponent(Graphics g) { } 

    // VI. Custom Instance Methods 
    public void readTextFile(String fileName) { } 

    public void loadLevel() { } 

    // VII. Main Method 
    public static void main(String[] args) { } 
} 
+0

Von 4 Sekunden geschlagen, verdammt! : D – MichaelK

+0

Nein, ich schrieb dies auf und wollte nur sicherstellen, dass das, was ich gesagt habe, Sinn ergab :) ... –

+0

Ich habe es versucht und es half dank, es gibt nicht mehr die Ausnahme außerhalb der Grenzen aber aus irgendeinem Grund es Läuft die verschachtelte Schleife 3 Mal und ich möchte es nur einmal ausführen .. Weißt du, warum es mehrmals läuft? – YoungStarDC

Verwandte Themen