📜  了解Java中的数组IndexOutofbounds异常

📅  最后修改于: 2020-03-28 11:06:51             🧑  作者: Mango

Java支持将数组作为数据结构创建和处理。数组的索引是一个整数值,其值的间隔为[0,n-1],其中n是数组的大小。如果请求一个负数或索引大于或等于数组的大小,则Java会引发ArrayIndexOutOfBounds异常。这与C/C++不同,在C/C++中,没有完成边界检查的索引。
ArrayIndexOutOfBoundsException是仅在运行时引发的运行时异常。Java编译器在程序编译期间不会检查此错误。

// Java的一个典型越界异常
public class NewClass2
{
    public static void main(String[] args)
    {
        int ar[] = {1, 2, 3, 4, 5};
        for (int i=0; i<=ar.length; i++)
          System.out.println(ar[i]);
    }
}

运行时错误引发异常:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at NewClass2.main(NewClass2.Java:5)

输出:

1
2
3
4
5

在这里,如果您仔细地看一下,数组的大小为5。因此,在使用for循环访问其元素时,index的最大值可以为4,但是在我们的程序中它将达到5,因此是异常。
让我们来看另一个使用arraylist的示例:

// Java另一个越界异常
import java.util.ArrayList;
public class NewClass2
{
    public static void main(String[] args)
    {
        ArrayList lis = new ArrayList<>();
        lis.add("我的");
        lis.add("名字");
        System.out.println(lis.get(2));
    }
}

与之前的时间相比,此处的运行时错误提供了更多信息

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at Java.util.ArrayList.rangeCheck(ArrayList.Java:653)
    at Java.util.ArrayList.get(ArrayList.Java:429)
    at NewClass2.main(NewClass2.Java:7)

让我们详细了解一下:

  • 此处的索引定义了我们尝试访问的索引。
  • 大小为我们提供了数组或列表大小的信息。
  • 由于size为2,所以我们可以访问的最后一个索引为(2-1)= 1,因此会出现异常

访问数组的正确方法是:

for (int i=0; i

处理异常:

  • 使用for-each循环访问数组的元素时,它会自动处理索引。例
    for(int m:ar){
    }
  • 使用Try-Catch:  考虑将代码包含在try-catch语句中,并相应地处理异常。如前所述,Java不会允许您访问无效的索引,并且肯定会抛出ArrayIndexOutOfBoundsException。但是,我们应该在catch语句的块内格外小心,因为如果我们没有适当地处理异常,我们可能会您的应用程序中创建错误。