2014-01-21 4 views
0

버튼을 클릭 할 때 카드를 그리는 작은 코드가 있습니다. 현재 actionPerformed()를 활성화하면 다음과 같은 오류가 발생합니다. "AWT-EventQueue-0 java.lang.IndexOutOfBoundsException ..."예외가 발생했습니다. 나는 완전히 새로운이에요. 그래서 그것이 단순한 실수라면 용서해주십시오.ActionListener의 Java 호출 메소드

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; /*Used for Random and ArrayList*/ 
public class AL extends Frame implements WindowListener,ActionListener { 
    TextField text = new TextField(20); 
    Button b; 
    private int numClicks = 0; 
    private static ArrayList<Card> deck=new ArrayList<Card>(); 
    private static ArrayList<Card> playerOneDeck=new ArrayList<Card>(); 
    private static ArrayList<Card> playerTwoDeck=new ArrayList<Card>(); 



    public static void main(String[] args) { 
      AL myWindow = new AL("Well of course you know, this means WAR!"); 
      myWindow.setSize(350,100); 
      myWindow.setVisible(true); 
      ArrayList<Card> playerTwoDeck=new ArrayList<Card>(); 
    }//end main() 

    public AL(String title) { 

      super(title); 
      setLayout(new FlowLayout()); 
      addWindowListener(this); 
      b = new Button("Draw"); 
      add(b); 
      add(text); 
      b.addActionListener(this); 
      ArrayList<Card> deck=new ArrayList<Card>(); 
      ArrayList<Card> playerOneDeck=new ArrayList<Card>(); 
      deck=initializeDeck(); 
      Collections.shuffle(deck); 
    } 

    public void actionPerformed(ActionEvent e) { 
      numClicks++; 
      Card theCard=playerOneDeck.get(0); 
      text.setText(theCard.name); 
      text.setText(theCard.name); 
    } 

    public void windowClosing(WindowEvent e) { 
      dispose(); 
      System.exit(0); 
    } 
    /*Assign names, values, and suits to all of the Card objects.*/ 
    public static ArrayList<Card> initializeDeck() { 
     Card[] tempDeck=new Card[52]; 
     ArrayList<Card> completeDeck=new ArrayList<Card>(); 
     for (int i=0; i<tempDeck.length; i++) { 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Two"; 
      tempDeck[i].value=2; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Three"; 
      tempDeck[i].value=3; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Four"; 
      tempDeck[i].value=4; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Five"; 
      tempDeck[i].value=5; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Six"; 
      tempDeck[i].value=6; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Seven"; 
      tempDeck[i].value=7; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Eight"; 
      tempDeck[i].value=8; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Nine"; 
      tempDeck[i].value=9; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Ten"; 
      tempDeck[i].value=10; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Jack"; 
      tempDeck[i].value=11; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Queen"; 
      tempDeck[i].value=12; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="King"; 
      tempDeck[i].value=13; 
      i++; 
      tempDeck[i]=new Card(); 
      tempDeck[i].name="Ace"; 
      tempDeck[i].value=14; 
     }//end FOR 
     /*Assign suits*/ 
     /*keep in mind that the array is now [2], [3],..[k],[a],[2],[3],[k],[a],etc */ 
     for (int j=0; j<tempDeck.length; j++) { 
      tempDeck[j].suit="Hearts"; 
      j++; 
      tempDeck[j].suit="Diamonds"; 
      j++; 
      tempDeck[j].suit="Spades"; 
      j++; 
      tempDeck[j].suit="Clubs"; 
     }//end FOR 

     for (int k=0; k<tempDeck.length;k++) { 
      completeDeck.add(tempDeck[k]); 
     } 
     return completeDeck; 
    }//end initializeDeck() 

    public void windowOpened(WindowEvent e) {} 
    public void windowActivated(WindowEvent e) {} 
    public void windowIconified(WindowEvent e) {} 
    public void windowDeiconified(WindowEvent e) {} 
    public void windowDeactivated(WindowEvent e) {} 
    public void windowClosed(WindowEvent e) {} 

} 당신은 ActionPerformed의 첫 번째 줄에 PlayerOneDeck에서 첫 번째 요소를 얻을려고

+2

1) 더 빨리 도움을 받으려면 [MCVE] (http://stackoverflow.com/help/mcve)를 게시하십시오. 2) 코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. 코드의 들여 쓰기는 사람들이 프로그램 흐름을 이해하도록 돕기위한 것입니다. 3)'정적'을 사용하는 것은 보통 불필요하며, 나쁜 코드 냄새가납니다. –

+0

스택 추적에서 예외가 발생한다고 말하는 행은 무엇입니까? – Kayaman

+0

BTW - 왜 Swing이 아닌 AWT인가? AWT 구성 요소를 사용하여 포기해야하는 많은 이유 때문에 [AWT를 통한 스윙 엑스트라] (http://stackoverflow.com/a/6255978/418556)에서 내 대답을 참조하십시오. –

답변

1

// 끝 AL 클래스 : Card theCard=playerOneDeck.get(0); 그러나, PlayerOneDeckArrayList입니다. 요소가 없기 때문에 요소를 가져 오려고하면 IndexOutOfBoundsException을 반환합니다.

클래스 변수 PlayerOneDeck과 동일한 이름의 생성자에서 변수를 초기화합니다. 요소를 사용하여 생성자 변수를 채울 수도 있지만 actionPerformed은 클래스 변수를 호출합니다.이 변수는 비어 있습니다. 예 :

public class Main { 
    ArrayList<Integer> array = new ArrayList<Integer>(); // class variable 

    public static void main(String[] args) { 
     ArrayList<Integer> array = new ArrayList<Integer>(); // method variable, overrides class variable within the main method 
     array.add(1); // adds 1 to the method variable 
     (new Main()).printArray(); 
    } 

    public void printArray() { 
     System.out.println(array.get(0)); // tries to print the first element of class variable, throws IndexOutOfBoundsException 
    } 
} 

로컬 변수를 제거하고 전역 클래스 만 사용하면 문제가 해결 될 수 있습니다.

+0

사과드립니다. 이전 버전을 복사하여 붙여 넣었습니다. PlayOneDeck에는 이제 내용이 있습니다. – eggHunter

+0

나는 논리가 정확하다는 것을 그래서 잘 작동하는 GUI없는 버전이있다. – eggHunter

+1

클래스 변수'PlayerOneDeck'이 있고'main' 메소드에서 같은 이름의 변수를 인스턴스화 한 것을 알았습니다. 그 메소드 변수를 요소로 채울 수는 있지만'actionPerformed'는 클래스 인스턴스 변수를 사용합니다. 변수는 비어있게됩니다. – asaini007