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

这意味着您试图访问的数组索引无效,因为它不在边界之间

例如,这将初始化一个上界为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循环,请这样做。)

您的第一个调用端口应该是

抛出以指示已使用非法索引访问数组。该索引为负数或大于或等于数组的大小

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
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和控制器的所有实例变量以查找可能的可疑对象。

我见过的最常见的情况是看似神秘的ArrayIndexOutofBoundsException,即appSimpleDataFormat的并发使用显然不是由您自己的数组处理代码引起的。特别是在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 (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
在数组中向后移动,或者仅对其他元素进行迭代

在执行此操作时,您可以保证不会耗尽要迭代的元素,并且您的[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您不能迭代或存储超过数组长度的数据。在这种情况下,您可以这样做:

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

如果将变量视为可以放置值的“长方体”,那么数组就是一系列相邻放置的长方体,其中长方体的数量是有限的,e
int[] array = new int[5];

//If you need just the items
Arrays.stream(array).forEach(item -> { println(item); });

//If you need the index as well
IntStream.range(0, array.length).forEach(index -> { println(array[index]); })
for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n'); // i goes from 0 to length, Not correct
}
for(int i = 0; i < name.length; i++) {
    System.out.print(name[i] +'\n');  // i goes from 0 to length - 1, Correct
}
String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
  System.out.print(name[i] +'\n');
}
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; 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