Java代码outOfBoundsException

时间:2014-02-16 16:58:52

标签: java arrays 2d

我的程序应该根据大写数组评估用户输入。看起来我一直收到像这样的错误消息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 19

任何人都可以提供帮助吗?

package Capitol;
import java.util.Scanner;

public class Capitol {

    static Scanner input = new Scanner(System.in).useDelimiter("\r\n"); 
    public static void main(String[] args) {
        int correctAnswer = 0;
        String [][] grid = {
                {"Alabama", "California", "Delaware", "Florida", "Georgia",
                "Hawaii", "Idaho", "Kansas", "Lousiana", "Maryland", "New Mexico", "Oregon",
                "Pennsylvania", "Rhode Island", "South Carolina", "Texas", "Utah", "Virgina",
                "West Virginia"},
                {"Montgomery", "Sacramento", "Dover", "Tallahassee", "Atlanta",
                "Honolulu", "Boise", "Topeka", "Baton Rouge", "Annapolis", "San Jose", "Salem",
                "Harrisburg", "Providence", "Columbia", "Austin", "Salt Lake City", "Richmond",
                "Charleston"}};

        for(int i = 0; i< grid.length; i++){
            System.out.println("What is the capital of ?");
            String capital = input.next();
            for(int k =0; k <20; k++ ){
                String answer = null;
                grid[i][k] = answer;


                if(capital.equalsIgnoreCase(answer)){
                correctAnswer ++;   
                System.out.println("Your answer is correct");
                }
                else
                    System.out.println("The correct answer should be" + grid[i]);
            }

        }
        System.out.println("The correct count is " + correctAnswer);
    }
}

2 个答案:

答案 0 :(得分:2)

你的数组行中只有19个项目(0到18索引),你正试图在19日工作。

变化

for(int k =0; k <20; k++ ){

for(int k =0; k <19; k++ ){

答案 1 :(得分:0)

在你的子阵列中,特别是第一个,你只有19个项目。由于数组索引从零开始,意味着它们从零开始,k的可用索引为0 - 18.当您尝试使用19时,您得到ArrayIndexOutOfBoundsException,基本上意味着您试图访问无效索引。

如果您更改以下行:

for(int k = 0; k < 20; k++) {

到此:

for(int k = 0; k < grid[i].length; k++) {

它应该可以解决你的问题。您应该使用grid[i].length而不是19这样的硬编码数字的原因是因为如果您更改grid数组,您的代码将适应您,并赢得了只是忽略索引19之后的任何条目。代码,grid[i].length确实得到了当前的子数组,并检索它的长度。这意味着即使子数组的长度不同,for循环也不会中断。 (虽然为什么你会想要用于此目的的不同大小的子阵列超出我的范围。)

希望这会有所帮助。