为什么我让索引超出范围?

时间:2015-05-28 11:40:31

标签: java

我的代码给出了这个错误:

  

索引越界

为什么会导致此错误?

public static void main(String[] args) {
    Map<Integer, String> hashMap = new HashMap<>();
    System.out.println("First input number of your years then name:");
    Scanner sken = new Scanner(System.in);

    while (sken.hasNext() && !sken.equals("exit")) {

        String[] line = sken.nextLine().split(",");
        String name = line[1];
        int howOld = Integer.parseInt(line[0]);
        hashMap.put(howOld, name);
    }
    System.out.println("Input Complete!");

    System.out.println("HeshMap input:");
    System.out.println(hashMap + "\n");  // <-- this line


    Map<Integer, String> treeMap = new TreeMap<>(hashMap);
    System.out.println("Sorted by years:");
    System.out.println(treeMap);

}

另外,我确信我用注释标记的行不能正确打印,打印HashMap的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

例外原因

因为您尝试java.lang.ArrayIndexOutOfBoundsException: 1我发现sken.nextLine().split(",");因为您输入的字符串中不包含,,因此您无法获得line[1];

String[] line = sken.nextLine().split(",");

如何重构代码

根据您的逻辑,您的输入应包含,字符,并且退出将像这样工作。

while(sken.hasNext())
    {

        String thisLine = sken.nextLine();
        if(thisLine.equals("exit")){
            break;
        }
        String[] line =thisLine.split(",");
        String name= line[1];
        int howOld= Integer.parseInt(line[0]);
        hashMap.put(howOld, name); 
    }

更多

可能对您有所帮助;)

while(true)
        {
            System.out.println("Please Enter Age:");
            int howOld = sken.nextInt();
            System.out.println("Please Enter Name:");
            String name = sken.next();
            String thisLine = sken.nextLine();
            hashMap.put(howOld, name); 

            System.out.println("Do you want the results (Y/N)?");
            String more= sken.next();
            if(more.equals("N") || more.equals("n")){
                break;
            }
        }

答案 1 :(得分:0)

String name= line[1];

以上这一行是罪魁祸首,您正在访问索引1,而不检查它是否存在。

如果您的输入字符串不包含任何逗号作为分隔符,,那么您肯定会得到此异常,因此最好在访问之前进行检查

if(line.length==1){ // then Access index 

}

答案 2 :(得分:0)

总是有一个try catch handler检查来处理这样的异常。

try{
 String[] line = sken.nextLine().split(",");
 String name= line[1];
 int howOld= Integer.parseInt(line[0]);
 hashMap.put(howOld, name); 
} catch (ArrayIndexOutOfBoundsException iobe) {
   // do something here
}