每日一BUG IndexOutOfBoundsException

简介: 每日一BUG IndexOutOfBoundsException

java.lang.IndexOutOfBoundsException

各位小伙伴对 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再次梳理代码了。其实有很多操作不当都会引起这个错误,我们要做的就是仔细,不要因为漏了一个小小的判断又要重新修改一次代码。

相关文章
|
13天前
|
数据采集 数据安全/隐私保护 开发者
一些`StringIndexOutOfBoundsException`异常的实际案例
本内容展示了几个实际中遇到的`StringIndexOutOfBoundsException`异常案例,帮助开发者理解该异常发生的原因及解决方法。
|
13天前
|
Java 索引
如何避免在 Java 中引发`StringIndexOutOfBoundsException`异常
在Java中,处理字符串时若访问了不存在的索引,会抛出`StringIndexOutOfBoundsException`异常。为避免此异常,应确保索引值在有效范围内,例如使用`length()`方法检查字符串长度,并确保索引值不小于0且不大于字符串长度减1。
|
22天前
|
Java
让星星⭐月亮告诉你,Java异常分类[Throwable(Error/Exception(RuntimeException/其他异常)) 检查时异常 非检查时异常]
本文深入解析了Java异常处理机制,重点介绍了`Throwable`类及其子类`Error`和`Exception`,并通过实例代码、流程图和表格详细解释了异常的分类、区别及处理方法,帮助读者掌握异常处理的关键技巧,提升程序的稳定性和健壮性。
39 1
|
6月前
|
安全 Java UED
如何避免NumberFormatException异常?
【4月更文挑战第30天】如何避免NumberFormatException异常?
56 1
|
5月前
|
搜索推荐 Java
Java异常:IllegalArgumentException Collections.sort报错
Java异常:IllegalArgumentException Collections.sort报错
55 0
项目中常见NPE空指针异常
项目中常见NPE空指针异常
|
6月前
Map遍历时报ConcurrentModificationException解决方法
Map遍历时报ConcurrentModificationException解决方法
426 0
|
缓存 搜索推荐 Java
开发小技巧系列 - 如何避免NullPointerException?(二)
NPE问题处理之二,引入了optional来处理,还有空对象
82 0
|
SQL 前端开发 Java
开发小技巧系列 - 如何避免NullPointerException?(一)
NPE是JAVA界面的常见问题,如何来避免呢?
97 0