为什么在不应该抛出异常时引发异常



我正在创建一个程序,让人们输入10个整数,并将它们从最小到最大显示。这是我的程序:

import java.util.Scanner;

公共类 EnterTenNumbers { public static void main(String[] args({

    System.out.println("Enter 10 numbers");
    int small=0;
    for(int i=0; i<10; i++){
        Scanner in=new Scanner(System.in);
        int[] i1=new int[10];
        int num=in.nextInt();
        i1[i]=num;
        if(i1[i]<i1[i+1] || i1[i]==i1[i+1]){
            System.out.println(i1);
        }else if(i1[i]>i1[i+1]){
            i1[i+1]=i1[i];
            System.out.println(i1);
        }
    }
}

}

当我运行我的程序时,在用户输入数字后,会出现"[I@55f96302"之类的东西。

在用户输入 10 个整数后,线程"main"中的异常 java.lang.ArrayIndexOutOfBounds异常:10 at EnterTenNumbers.main(EnterTenNumbers.java:13(出现时,它应显示从小到大的数字。

发生了什么事?

  1. 每次要求用户给出一个数字作为输入时,您都会创建一个新的整数数组。你不是应该只创建一个数组来保存这 10 个整数吗?因此,在循环外部声明整数数组。这样,它只会被声明一次。

  2. 您必须
  3. 在一开始就从用户那里获取所有 10 个整数,然后您必须对这 10 个整数运行操作,以便从最小到最大显示它们。

  4. 从用户那里获取所有 10 个整数并将它们保存在 A 数组中后,您必须再次在这些数字之间逐个循环,并检查哪个数字最小,哪个数字最大。当循环检查数组的最后一个索引时,您无法检查该数组的下一个索引(因为数组的索引不存在(。这就是为什么你每次都有例外。

    if(i1[i]<i1[i+1] || i1[i]==i1[i+1]){
        System.out.println(i1);
    }else if(i1[i]>i1[i+1]){
        i1[i+1]=i1[i];
        System.out.println(i1);
    }
    

当我运行我的程序时,在用户输入数字之后,诸如此类的事情 像"[I@55f96302"出现。

这是因为您打印的是数组的字符串表示形式,而不是数组的元素。

取代

System.out.println(i1);

System.out.println(i1[i]);

在用户输入 10 个整数后,线程"main"中的异常 java.lang.ArrayIndexOutOfBoundsException: 10

正如异常清楚地表明的那样,您正在尝试访问数组的第 10 个索引(索引从 0 开始(或第 11 个元素。但是您的数组只有 10 个元素。所以这就是你得到AIOOBE.在你的条件语句中,当 i=9 时,谓词 i1[i+1] 变成 i1[10]。您需要解决此问题。

最后,您也可以通过以下方式实现目标:

System.out.println("Enter 10 numbers");
int small=0;
for(int i=0; i<10; i++){
    Scanner in=new Scanner(System.in);
    int[] i1=new int[10];
    int num=in.nextInt();
    i1[i]=num;
}
Arrays.stream(i1).sorted().forEach(System.out::println);

最新更新