为什么我会收到IndexOutofBoundsException?

时间:2014-05-16 13:14:39

标签: java swing netbeans indexoutofboundsexception

我正在使用Swing GUI表单开始编程我的最终项目。这就是导致我出现问题的原因

if (generated.get(round) == 1)

它的数字并不重要,任何类似的语句都会给我IndexOutOfBoundsException。你们能帮忙吗? (startButton位于中间)

round让我搞砸了,但我不知道为什么会搞乱电话

import java.util.ArrayList;
import java.util.Queue;
import java.util.Stack;
import javax.swing.JOptionPane;
public class finalProject extends javax.swing.JFrame {

/**
 * Creates new form finalProject
 */
public finalProject() {
    initComponents();
    // declare colors in array
    color [0] = "blue";
    color [1] = "red";
    color [2] = "green";
    color [3] = "orange";
    color [4] = "silver";

    // make sure leaderboard is clear
    leaderboardNum.clear();
    leaderboardName.clear();

    // no idea what this does
    finalProject.this.setLocationRelativeTo(null);
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

故意在这里取出代码

 }// </editor-fold>

private void resetButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // TODO add your handling code here:
    // clear all queues and data except for colors
    leaderboardNum.clear();
    leaderboardName.clear();
    generated.clear();
}                                           

private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // TODO add your handling code here:

    // assume the person hasn't failed yet
    failed = false;

    // check if name entered
    if (nameBox.getText().equals(""))
    {
        JOptionPane.showMessageDialog(null, "Put in a name or nickname", "Try again", JOptionPane.ERROR_MESSAGE);
    } 
    else
    {
        // keep looping pattern until person fails
        do
        {                
            // begin generating random numbers for pattern
            generated.add((int) (Math.random() * 5));

            if (generated.get(round) == 0) // if the # is blue
            {
                // flash blue button or do something special
                blueButton.setVisible(false);

                // make loop to count time
                for (int loop1 = 0; loop1 < 200; loop1++);

                // bring blue button back
                blueButton.setVisible(true);

                // check if they click the blue button
                if (blueButton.isSelected())
                {
                    //correct goes up one
                    correct++;

                }

                else
                {
                    // if they hit the wrong button, it resets the random & records score
                    generated.clear();

                    leaderboardName.add(nameBox.getText());
                    leaderboardNum.add(correct);

                    //show they failed
                    failed = true;
                }
            }

            if (generated.get(round) == 1) // if the # is red
            {
                // flash blue button or do something special
                redButton.setVisible(false);

                // make loop to count time
                for (int loop1 = 0; loop1 < 200; loop1++);

                // bring blue button back
                redButton.setVisible(true);

                // check if they click the blue button
                if (redButton.isSelected())
                {
                    //correct goes up one
                    correct++;

                }

                else
                {
                    // if they hit the wrong button, it resets the random & records score
                    generated.clear();

                    leaderboardName.add(nameBox.getText());
                    leaderboardNum.add(correct);

                    //show they failed
                    failed = true;
                }
            }

            if (generated.get(round) == 2) // if the # is green
            {
                // flash blue button or do something special
                greenButton.setVisible(false);

                // make loop to count time
                for (int loop1 = 0; loop1 < 200; loop1++);

                // bring blue button back
                greenButton.setVisible(true);

                // check if they click the blue button
                if (greenButton.isSelected())
                {
                    //correct goes up one
                    correct++;

                }

                else
                {
                    // if they hit the wrong button, it resets the random & records score
                    generated.clear();

                    leaderboardName.add(nameBox.getText());
                    leaderboardNum.add(correct);

                    //show they failed
                    failed = true;
                }
            }

            if (generated.get(round) == 3) // if the # is orange
            {
                // flash blue button or do something special
                orangeButton.setVisible(false);

                // make loop to count time
                for (int loop1 = 0; loop1 < 200; loop1++);

                // bring blue button back
                orangeButton.setVisible(true);

                // check if they click the blue button
                if (orangeButton.isSelected())
                {
                    //correct goes up one
                    correct++;

                }

                else
                {
                    // if they hit the wrong button, it resets the random & records score
                    generated.clear();

                    leaderboardName.add(nameBox.getText());
                    leaderboardNum.add(correct);

                    //show they failed
                    failed = true;
                }
            }

            if (generated.get(round) == 4) // if the # is silver
            {
                // flash blue button or do something special
                silverButton.setVisible(false);

                // make loop to count time
                for (int loop1 = 0; loop1 < 2000; loop1++);

                // bring blue button back
                silverButton.setVisible(true);

                // check if they click the blue button
                if (silverButton.isSelected())
                {
                    //correct goes up one
                    correct++;

                }

                else
                {
                    // if they hit the wrong button, it resets the random & records score
                    generated.clear();

                    leaderboardName.add(nameBox.getText());
                    leaderboardNum.add(correct);

                    //show they failed
                    failed = true;
                }
            }

            // when game finishes, next round goes
            round++;

        } while (failed == false);
    }
}                                           

private void scoreButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // TODO add your handling code here:
    // declare certain variables
    boolean sorted;
    int pass = 0, numTemp = 0;
    String nameTemp;

    // clear generated queue
    generated.clear();

    // hide all pictures and color buttons, show scores in scoreBox

    // make sure the thing is cleared already
    scoreBox.setText("");

    //check if no scores
    if (leaderboardNum.isEmpty())
    {
        scoreBox.setText("Go play the game and come back later!");
    }

    else
    {
        //bubble sort by score

        do
        {  
            // assume its sorted unless proven other wise
            sorted = true;

            // update pass
            pass++;

            // loop through score arraylist
            for (int sortLoop = 0; sortLoop < leaderboardNum.size() - pass; sortLoop++)
            {
                if (leaderboardNum.get(sortLoop) < leaderboardNum.get(sortLoop + 1))
                {
                    // switch scores
                    numTemp = leaderboardNum.remove(sortLoop);
                    leaderboardNum.set(sortLoop, leaderboardNum.remove(sortLoop + 1));
                    leaderboardNum.set(sortLoop + 1, numTemp);

                    // switch names
                    nameTemp = leaderboardName.remove(sortLoop);
                    leaderboardName.set(sortLoop, leaderboardName.remove(sortLoop + 1));
                    leaderboardName.set(sortLoop + 1, nameTemp);

                    // declare unsorted
                    sorted = false;
                }
            }
        }
        while (sorted == false);
    }
}                                           

private void quitButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
    // TODO add your handling code here:
    // exit button
    System.exit(WIDTH);
}                                          

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /*
     * Set the Nimbus look and feel
     */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /*
     * If Nimbus (introduced in Java SE 6) is not available, stay with the
     * default look and feel. For details see
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(finalProject.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(finalProject.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(finalProject.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(finalProject.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /*
     * Create and display the form
     */
    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new finalProject().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JButton blueButton;
private javax.swing.JLabel creatorLabel;
private javax.swing.JLabel creditsLabel;
private javax.swing.JTabbedPane gameSkeleton;
private javax.swing.JButton greenButton;
private javax.swing.JLabel instructionLabel;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel leaderboardLabel;
private javax.swing.JPanel leaderboardPanel;
private javax.swing.JPanel mainGameBackground;
private javax.swing.JTextField nameBox;
private javax.swing.JLabel nameLabel;
private javax.swing.JButton orangeButton;
private javax.swing.JLabel pentagramPicture;
private javax.swing.JButton quitButton;
private javax.swing.JButton redButton;
private javax.swing.JButton resetButton;
private javax.swing.JTextArea scoreBox;
private javax.swing.JButton scoreButton;
private javax.swing.JButton showScoreButton;
private javax.swing.JButton silverButton;
private javax.swing.JButton startButton;
private javax.swing.JLabel thankYouLabel;
// End of variables declaration  

// Declare leaderboard array list, will be sorted from high ==> low
ArrayList<Integer> leaderboardNum = new ArrayList<Integer>();
ArrayList<String> leaderboardName = new ArrayList<String>();

// give each color/spot on pentagram a # in an array, declared at top
String color [] = new String [5];

// random number that makes the color do the thing
ArrayList<Integer> generated = new ArrayList<Integer>();

// variable to see if player messed up
boolean failed;

// variable to see if player passed & to count the # of rounds
int correct = 0, round = 0;

}

这应该像西蒙说游戏一样。如果您可以推荐更有效的方法,那么我很乐意调查它!

3 个答案:

答案 0 :(得分:1)

抛出array out of bounds exception表示已使用非法索引访问了数组。索引为负数或大于或等于数组的大小。

这来自if (generated.get(round) == 1),因为之前您致电generated.clear(); removes all elements of your arraylist。这意味着您正在尝试访问阵列中不存在的索引。

答案 1 :(得分:0)

您已将round字段初始化为0.并且在do-while循环中,您首先将值添加到列表generated.add((int) (Math.random() * 5));并尝试获取generated.get(round)这应该可以正常运行。如果不是这种情况,您应该检查是否在其他地方修改了round。在获取之前尝试打印出圆形和列表大小的值。

然而,在基于某些条件的do-while循环中,您正在清除列表generated.clear();,并且在循环结束时递增。因此,在第二次迭代中,您可能尝试从大小为1的列表中获取索引1.请记住,索引从0开始,因此您实际上尝试从仅包含1个元素的列表中获取第2个元素。因此,当你执行generated.clear();时,你也应该重置为0。

答案 2 :(得分:-1)

当您尝试访问数组大小或边界之外的元素时,会发生

IndexOutOfBoundsException /

假设我们有一个长度为5的数组;如果我们试图在4之后访问该元素,它将抛出该异常。