2016-04-07 32 views
1

Fayanslarla (10 x 10) bir oyun tahtası oluşturmaya çalışıyoruz. Ancak, aşağıdaki sınıfı çalıştırırken, bir ArrayIndexOutOfBoundsException almaya devam ediyoruz. Bazı nedenlerle, aynı sınıfı başka bir cihazda çalıştırırken, bu hata verilmez. İstisna"AWT-EventQueue-0" iş parçacığındaki özel durum 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); 

    } 

} 

Bölüm: En çift iç içe döngü başlamadan önce

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

Siz i sıfırlamayı sıfırlamıyorsunuz. Bunu, iç içe döngüyü başlatmadan önce paintComponent öğesinin başlangıcında yapın. – MichaelK

cevap

0

Sen i sıfırlamak olmadı. Değişkeni içeri taşıyın veya 0'a sıfırlayın.

@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(); 
    } 
} 

Ben de daha kolay okunmasını sağlamak için sınıfınızı yeniden önermek istiyorum. Bunu mektuba kadar takip etmek zorunda değilsiniz, ancak benzer şeyleri gruplandırmaya çalışın. Bu, işleri daha iyi bir hale getirecek ve başkalarının programınızı daha kolay takip etmesine yardımcı olacaktır.

Bu basit ipucu ile int i = 0 (örnek değişken) başıboşluğu kolayca tespit edilebilirdi.

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

4 saniye içinde dövüldü, kahretsin! : D – MichaelK

+0

Hayır, bunu yazıyordum ve söylediğim şeyin mantıklı olduğundan emin oldum :) ... –

+0

Denedim ve teşekkür ettim, Artık sınır istisnasından vazgeçmiyor ama bir sebepten dolayı iç içe döngü 3 kez çalışır ve ben sadece 1 kez çalıştırmak istiyorum .. Neden birden çok kez çalışır biliyor musunuz? – YoungStarDC