是什么导致java.lang.ArrayIndexOutOfBoundsException以及如何防止它?
是什么导致java.lang.ArrayIndexOutOfBoundsException以及如何防止它?,java,Java,ArrayIndexOutOfBoundsException是什么意思?如何消除它 以下是触发异常的代码示例: String[] names = { "tom", "bob", "harry" }; for (int i = 0; i <= names.length; i++) { System.out.println(names[i]); } myArray[5] //tries to retrieve the 6th "box" when there is only 5 my
ArrayIndexOutOfBoundsException
是什么意思?如何消除它
以下是触发异常的代码示例:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
String[]name={“汤姆”、“鲍勃”、“哈里”};
对于(int i=0;i,这意味着您试图访问数组的索引,该索引无效,因为它不在边界之间
例如,这将初始化一个上界为4的基本整数数组
int intArray[] = new int[5];
程序员从零开始计数。例如,这将抛出一个ArrayIndexOutOfBoundsException
,因为上界是4而不是5
intArray[5];
您的第一个呼叫端口应为,合理清晰地解释:
抛出以指示已使用非法索引访问数组。该索引为负数或大于或等于数组的大小
for(String str : array) {
System.out.println(str);
}
例如:
int[] array = new int[5];
int boom = array[10]; // Throws the exception
String[] a={"str1", "str2", "str3" ..., "strn"};
for(int i=0; i<a.length(); i++)
System.out.println(a[i]);
int [][][] a = new int [2][3][4];
for(int i = 0; i < a.length; i++){
for(int j = 0; j < a[i].length; j++){
for(int k = 0; k < a[j].length; k++){
System.out.print(a[i][j][k]);
}
System.out.println();
}
System.out.println();
}
至于如何避免…嗯,不要这样做。小心你的数组索引
人们有时遇到的一个问题是认为数组是单索引的,例如
int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
System.out.println(array[index]);
}
(当然,这是假设您需要索引。如果您可以使用增强的for循环,请这样做。)If(index<0 | | index>=array.length){
//不要使用此索引。这超出了范围(边界、限制等)。
}否则{
//是的,您可以安全地使用此索引。该索引存在于数组中。
对象元素=数组[索引];
}
另见:
更新:根据您的代码片段
for (int i = 0; i<=name.length; i++) {
for(int i=0;i我见过的关于看似神秘的ArrayIndexOutofBounds概念(即显然不是由您自己的数组处理代码引起的)的最常见情况是并发使用SimpleDataFormat。特别是在servlet或控制器中:
public class MyController {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
public void handleRequest(ServletRequest req, ServletResponse res) {
Date date = dateFormat.parse(req.getParameter("date"));
}
}
如果两个线程同时输入SimpleDateFormat.parse()方法,您可能会看到ArrayIndexOutOfBoundsException
确保您的代码中没有以servlet或控制器等并发方式访问线程不安全类(如SimpleDataFormat)的地方。检查servlet和控制器的所有实例变量以查找可能的可疑对象。来自这篇优秀文章:
简而言之:
在
for (int i = 0; i <= name.length; i++) {
为了避免数组索引越界异常,应该在何时何地使用语句
主要动机(和用例)是当您进行迭代时,您不需要任何复杂的迭代步骤。您将无法使用增强的-for
在数组中向后移动,或者仅对其他元素进行迭代
在执行此操作时,您可以保证不会耗尽要迭代的元素,并且您的[corrected]示例很容易转换
代码如下:
String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
System.out.print(name[i] + "\n");
}
您不能迭代或存储超过数组长度的数据。在这种情况下,您可以这样做:
for (int i = 0; i <= name.length - 1; i++) {
// ....
}
final int[] myArray = new int[5]
myArray[3]
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
myArray[5]
for(int i=0;i是什么导致了ArrayIndexOutOfBoundsException
?
如果将变量视为可以放置值的“长方体”,那么数组就是一系列相邻放置的长方体,其中长方体的数量是一个有限的显式整数
创建如下数组:
for (int i = 0; i <= name.length - 1; i++) {
// ....
}
final int[] myArray = new int[5]
myArray[3]
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
myArray[5]
创建一行5个框,每个框都包含一个int
。每个框都有一个索引,即框系列中的一个位置。该索引从0开始,到N-1结束,其中N是数组的大小(框的数量)
要从这一系列框中检索其中一个值,可以通过其索引对其进行引用,如下所示:
for (int i = 0; i <= name.length - 1; i++) {
// ....
}
final int[] myArray = new int[5]
myArray[3]
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
myArray[5]
这将为您提供系列中第四个框的值(因为第一个框的索引为0)
ArrayIndexOutOfBoundsException
是由于试图通过传递高于上一个“box”的索引或负值来检索不存在的“box”而导致的
在我运行的示例中,这些代码片段会产生这样的异常:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
如何避免arrayindexoutofbounds异常
为了防止出现ArrayIndexOutOfBoundsException
,需要考虑以下几点:
循环
在数组中循环时,始终确保要检索的索引严格小于数组的长度(框的数量)。例如:
for (int i = 0; i < myArray.length; i++) {
只是不要。坚持上面的一个(如果你需要使用索引),它会帮你省去很多痛苦
在可能的情况下,使用foreach:
for (int value : myArray) {
这样,您根本不必考虑索引
在循环时,无论您做什么,都不要更改循环迭代器的值(此处:i
)。唯一应该更改值的地方是保持循环继续。否则更改它只会导致异常,在大多数情况下是不必要的
检索/更新
检索数组的任意元素时,请始终根据数组的长度检查该元素是否为有效索引:
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}
public整数getArrayElement(最终整数索引){
if(索引<0 | |索引>=myArray.length){
return null;//尽管我更希望在发生这种情况时引发实际异常。
}
返回myArray[index];
}
对于长度为n的任何数组,数组元素的索引将从0到n-1。
如果您的程序试图访问数组索引大于n-1的任何元素(或内存),那么Java将抛出ArrayIndexOutOfBoundsException
这里有两个解决方案,我们可以在程序中使用
保持计数:
for(int count = 0; count < array.length; count++) {
System.out.println(array[count]);
}
由于i
这就是在Eclipse中引发此类异常时的外观。红色数字表示您尝试访问的索引。因此代码如下所示:
for (int i = 0; i <= name.length - 1; i++) {
// ....
}
final int[] myArray = new int[5]
myArray[3]
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
myArray[5]
当
for(int i = 0; i<name.length; i++)
for(String i : name )
System.out.println(i);
int [][][] a = new int [2][3][4];
for(int i = 0; i < a.length; i++){
for(int j = 0; j < a[i].length; j++){
for(int k = 0; k < a[j].length; k++){
System.out.print(a[i][j][k]);
}
System.out.println();
}
System.out.println();
}
class demo{
public static void main(String a[]){
int[] numberArray={4,8,2,3,89,5};
int i;
for(i=0;i<numberArray.length;i++){
System.out.print(numberArray[i+1]+" ");
}
}
String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
System.out.println(name[i]);
}
String[] array = new String[]{"aaa", null, "ccc"};
for (int i = 0; i < 4; i++) {
String result = Optional.ofNullable(array.length > i ? array[i] : null)
.map(x -> x.toUpperCase()) //some operation here
.orElse("NO_DATA");
System.out.println(result);
}
AAA
NO_DATA
CCC
NO_DATA