Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么导致java.lang.ArrayIndexOutOfBoundsException以及如何防止它?_Java - Fatal编程技术网

是什么导致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