Java 为什么我的索引超出了界限?

Java 为什么我的索引超出了界限?,java,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);

我的代码出现以下错误:

索引越界

为什么会导致这个错误

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);

}
publicstaticvoidmain(字符串[]args){
Map hashMap=新hashMap();
System.out.println(“首先输入您的年数,然后输入姓名:”);
扫描仪sken=新扫描仪(System.in);
而(sken.hasNext()&&!sken.equals(“退出”)){
String[]line=sken.nextLine().split(“,”);
字符串名称=行[1];
int howOld=Integer.parseInt(第[0]行);
hashMap.put(多大,名称);
}
System.out.println(“输入完成!”);
System.out.println(“HeshMap输入:”);
System.out.println(hashMap+“\n”);//
上面这一行是罪魁祸首,您正在访问索引
1
,而没有检查它是否存在

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

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

}

异常原因

以下行出现的原因
java.lang.ArrayIndexOutOfBoundsException:1
因为您试图
sken.nextLine().split(,”)
I输入的字符串不包含
,其中无法获取
行[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); 
    }
更多

可能对您有帮助;)


始终对处理此类异常的try-catch处理程序进行检查

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
}

什么是
!sken.equals(“退出”)
?你不能将
扫描器
字符串
进行比较-这永远都是正确的。哦,你是对的,必须先解决这个问题。虽然在这种情况下似乎没有必要,但当你遇到这样的异常时,你应该将调用堆栈添加到你的帖子中。帮助我们帮助你。并且你应该就如何定位打开一个单独的问题这不是HashMap。谢谢你的回答,但我需要做什么呢?我的意思是,你知道了,我想以某种方式将行拆分为整数和字符串,然后用HashMap编写。我认为你的排序映射会起作用。你为什么不一个接一个地询问年龄而不是名称呢。这减少了出错的机会这主意不错,但我喜欢现在的方式:D。它起作用了现在,在“退出”命令下,它会打印出所有的内容,谢谢你,我希望你用同样的方式,试着给出示例输入。因为我逐行阅读你的while循环,看看什么应该是你的有效输入!Sarz制作了一个全新的while循环,它做得很好:)
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;
            }
        }
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
}