每日一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);
}
AI 代码解读

运行结果

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)
AI 代码解读

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

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

    return elementData(index);
}

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

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

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));
    }
}
AI 代码解读

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

ArrayIndexOutOfBoundsException

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

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

运行结果

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
AI 代码解读

其解决办法也是雷同

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

StringIndexOutOfBoundsException

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

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

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

一个简单的问题

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

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

总结

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

目录
打赏
0
0
0
0
2
分享
相关文章
|
10月前
|
如何避免NumberFormatException异常?
【4月更文挑战第30天】如何避免NumberFormatException异常?
106 1
分析一个错误使用MemoryCache导致的BUG
分析一个错误使用MemoryCache导致的BUG
156 0
分析一个错误使用MemoryCache导致的BUG
|
10月前
项目中常见NPE空指针异常
项目中常见NPE空指针异常
关于数组越界却不会报错
关于数组越界却不会报错
100 1
|
10月前
Map遍历时报ConcurrentModificationException解决方法
Map遍历时报ConcurrentModificationException解决方法
624 0
别再写 bug 了,避免空指针的 5 个案例!
空指针是我们 Java 开发人员经常遇到的一个基本异常,这是一个极其普遍但似乎又无法根治的问题。 本文,栈长将带你了解什么是空指针,还有如何有效的避免空指针。
343 0
BUG现形记(二)——偷工减料的复制构造函数
  【课程支撑】我的 C++程序设计课程教学材料   【摘要】设计数组类,要实现数组类中两个数组相加的运算,程序却陷入死循环。逐层排查,重载的加法正确,重载的赋值运算也看不出问题。跟踪到赋值运算的实现中发现,传递的参数中有异常,终于找出了嫌疑犯——编制的复制构造函数偷工减料。   【阅读提示】现在打开你熟悉的c++,跟随作者的的思路,重走发现嫌犯的过程。   题目是建立专门的数组类处理有关数
1537 0
一个关于临时对象的BUG
转自:https://blog.csdn.net/TeddyWing/article/details/13170 (博主看完这篇博客之后,感觉自己不会C++了,呜呜呜)   我相信任何一个使用C++超过一定时间的程序员都不会否认这样一个事实:使用C++需要有足够的技巧。
1009 0
一个关于List的IndexOutOfBoundsException异常记录
一个关于List的IndexOutOfBoundsException异常记录
130 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等