java.lang.IndexOutOfBoundsException

·  阅读 1218
java.lang.IndexOutOfBoundsException

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

各位小伙伴对IndexOutOfBoundsException是不是很熟悉,是不是经常遇到,其实我们还会遇到他的子类ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsException,那么为什么会跑出这个异常呢?其实是某种索引(例如数组,字符串或向量)的索引超出范围。

IndexOutOfBoundsException

我们举个最常见出现错误的例子
错误复现

public static void main(String[] args) {
    List<String> x = new ArrayList<>();
    x.add("0");
    x.add("1");
    int y = 2;
    x.get(y);
}
复制代码

运行结果

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
	at java.util.ArrayList.get(ArrayList.java:433)
复制代码

为什么会抛出这个异常呢?我们来看源码。

public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
复制代码

你看到了源码在取元素的时候都做的检查,我们在取的时候也要去做。

public static void main(String[] args) {
    List<String> x = new ArrayList<>();
    x.add("0");
    x.add("1");
    int y = 2;
    if (x.size() > y) {
        System.out.println(x.get(y));
    }
}
复制代码

这样就可以避免这种问题。这个只是示例,现实中有的比这复杂多了,但是每个都肯定有其对应的解决方案。

ArrayIndexOutOfBoundsException

关于ArrayIndexOutOfBoundsException异常,看其前缀就知道是Array抛出来的异常。
我们举个最常见出现错误的例子和上面都是雷同的
错误复现

public static void main(String[] args) {
    int[] x = {1,2};
    int y = 2;
    System.out.println(x[y]);
}
复制代码

运行结果

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
复制代码

其解决办法也是雷同

public static void main(String[] args) {
    int[] x = {1,2};
    int y = 2;
    if (x.length > y){
        System.out.println(x[y]);
    }
}
复制代码

StringIndexOutOfBoundsException

哈哈这个不用说了,肯定和String脱不了关系了。
举一个最常见的例子
错误复现

public static void main(String[] args) {
    String x = "你好";
    System.out.println(x.substring(3));
}
复制代码

原因则是截取字符是字符串数组下表越界。

一个简单的问题

下面这段代码抛什么异常。

public static void main(String[] args) {
    List<String> x = Arrays.asList("0","1");
    int y = 2;
    System.out.println(x.get(y));
}
复制代码

总结

关于IndexOutOfBoundsException这个异常我们都可以避免的,我们在操作字符串数组集合都去仔细的做一次判断,这样我们就不会为出现这个BUG再次梳理代码了。其实有很多操作不当都会引起这个错误,我们要做的就是仔细,不要因为漏了一个小小的判断又要重新修改一次代码。

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改