IndexOutOfBoundsException
是 Java 中常见的运行时异常,表示访问了无效的索引(数组、集合、字符串等)。本文将从原因分析到解决方法,并提供真实案例和代码示例,帮你彻底解决这个问题。
1. 问题分析
抛出 IndexOutOfBoundsException
的常见场景:
-
数组越界
:
- 索引小于 0 或大于等于数组长度。
-
集合越界
:
- 对
List
等集合使用无效索引。
- 对
-
字符串索引越界
:
- 使用非法索引调用
charAt()
或substring()
。
- 使用非法索引调用
-
迭代器错误
:
- 循环访问过程中索引超出范围。
2. 解决思路
-
检查索引合法性
:
- 确保索引在有效范围内。
-
添加边界检查
:
- 在操作前检查索引是否超出范围。
-
修正循环条件
:
- 确保循环不会导致索引溢出。
-
处理空或空集合
:
- 确保操作前集合或数组非空。
3. 解决方法
方法 1:检查数组索引范围
问题代码:
int[] arr = {1, 2, 3};
int value = arr[3]; // 数组索引超出范围
解决方案:
int[] arr = {1, 2, 3};
if (arr.length > 3) {int value = arr[3];System.out.println(value);
} else {System.out.println("Index out of bounds!");
}
方法 2:修正 List
索引操作
问题代码:
List<String> list = new ArrayList<>(List.of("A", "B", "C"));
String value = list.get(5); // 索引超出范围
解决方案:
List<String> list = new ArrayList<>(List.of("A", "B", "C"));
int index = 5;
if (index >= 0 && index < list.size()) {String value = list.get(index);System.out.println(value);
} else {System.out.println("Invalid index: " + index);
}
方法 3:安全处理 String
的子串操作
问题代码:
String str = "Hello, Java!";
String sub = str.substring(5, 20); // 索引超出范围
解决方案:
String str = "Hello, Java!";
int start = 5, end = 20;
if (start >= 0 && end <= str.length() && start < end) {String sub = str.substring(start, end);System.out.println(sub);
} else {System.out.println("Invalid substring range!");
}
方法 4:修正循环条件
问题代码:
int[] arr = {1, 2, 3};
for (int i = 0; i <= arr.length; i++) { // 循环条件错误System.out.println(arr[i]);
}
解决方案:
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) { // 修正循环条件System.out.println(arr[i]);
}
方法 5:避免操作空数组或集合
问题代码:
int[] arr = null;
System.out.println(arr[0]); // 数组为空
解决方案:
int[] arr = null;
if (arr != null && arr.length > 0) {System.out.println(arr[0]);
} else {System.out.println("Array is null or empty!");
}
4. 真实案例
案例描述: 在分页查询时,返回的记录列表为空或索引超出范围,导致异常。
问题代码:
List<String> data = new ArrayList<>();
String firstElement = data.get(0); // 列表为空
解决方案:
List<String> data = new ArrayList<>();
if (!data.isEmpty()) {String firstElement = data.get(0);System.out.println("First element: " + firstElement);
} else {System.out.println("List is empty!");
}
5. 综合示例代码
以下是一个包含数组、集合、字符串的综合示例:
public class IndexOutOfBoundsExample {public static void main(String[] args) {// 数组操作int[] arr = {10, 20, 30};int index = 3;if (index >= 0 && index < arr.length) {System.out.println("Array value: " + arr[index]);} else {System.out.println("Array index out of bounds!");}// 集合操作List<String> list = new ArrayList<>(List.of("A", "B", "C"));int listIndex = 2;if (listIndex >= 0 && listIndex < list.size()) {System.out.println("List value: " + list.get(listIndex));} else {System.out.println("List index out of bounds!");}// 字符串操作String str = "Hello";int start = 1, end = 6;if (start >= 0 && end <= str.length() && start < end) {System.out.println("Substring: " + str.substring(start, end));} else {System.out.println("String index out of bounds!");}}
}
6. 总结
避免 IndexOutOfBoundsException
的有效方法:
- 检查索引合法性
- 索引应在有效范围
[0, size-1]
内。
- 索引应在有效范围
- 修正逻辑错误
- 确保循环和索引运算正确。
- 边界检查
- 添加边界条件以防止非法操作。
- 操作前验证非空
- 避免对空集合或空数组操作。
通过以上方法,可以有效解决 IndexOutOfBoundsException
异常问题,提高代码健壮性!