java.lang.IndexOutOfBoundsException
各位小伙伴对IndexOutOfBoundsException
是不是很熟悉,是不是经常遇到,其实我们还会遇到他的子类ArrayIndexOutOfBoundsException
和StringIndexOutOfBoundsException
,那么为什么会跑出这个异常呢?其实是某种索引(例如数组,字符串或向量)的索引超出范围。
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
再次梳理代码了。其实有很多操作不当都会引起这个错误,我们要做的就是仔细,不要因为漏了一个小小的判断又要重新修改一次代码。