在JAVA中打印3D数组时出现ArrayIndexOutOfBoundsException

时间:2014-02-17 15:45:15

标签: java exception multidimensional-array

我在JAVA中编写了以下代码。

package threed;

import java.util.Scanner;

  public class Threed_Array {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
int b1,b2,b3;
System.out.print("Enter the number of elements in 1st bracket->");
Scanner sc=new Scanner(System.in);
b1=sc.nextInt();
System.out.print("Enter the number of elements in 2nd bracket->");

b2=sc.nextInt();
System.out.print("Enter the number of elements in 3rd bracket->");

b3=sc.nextInt();
int threedarray[][][]=new int[b1][b2][b3];

for(int i=1; i<=b1; i++)
{
    for(int j=1; i<=b2; j++)
    {
        for(int k=1; i<=b3; k++)
        {
          System.out.print("Enter element->");
          threedarray[i][j][k]=sc.nextInt();
        }
    }
}
for(int i=1; i<=b1; i++)
{
    for(int j=1; i<=b2; j++)
    {
        for(int k=1; i<=b3; k++)
        {
          System.out.print(" "+threedarray[i][j][k]);

        }
    }
}

}
}

我收到此代码的ArrayIndexOutOfBoundsException。这显示在以下行中:

threedarray[i][j][k]=sc.nextInt();

有人可以帮我解决发生错误的地方吗?谢谢。

8 个答案:

答案 0 :(得分:3)

您应始终从索引0开始,它是数组第一个元素的索引:

for(int i=0; i<b1; i++)
{
    for(int j=0; j<b2; j++)
    {
        for(int k=0; k<b3; k++) {
          System.out.print("Enter element->");
          threedarray[i][j][k]=sc.nextInt();
        }
    }
}
for(int i=0; i<b1; i++)
{
    for(int j=0; j<b2; j++)
    {
        for(int k=0; k<b3; k++)
        {
          System.out.print(" "+threedarray[i][j][k]);
        }
    }
}

进一步使用<而非<=

进行检查

使用最后一个循环访问数组元素n + 1,其中n是该数组的大小。这就是例外的原因。

答案 1 :(得分:2)

我会说你的循环中的条件不正确:

for(int i=1; i<=b1; i++)
{
    for(int j=1; i<=b2; j++)
    {
        for(int k=1; i<=b3; k++)
        {

它应该是:

for(int i=1; i<=b1; i++)
{
    for(int j=1; j<=b2; j++)
    {
        for(int k=1; k<=b3; k++)
        {

此外,你应该从0开始。

答案 2 :(得分:1)

我认为您希望j圈内的kfor代替i圈而不是for(int i=0; i<b1; i++) { for(int j=0; j<b2; j++) { for(int k=0; k<b3; k++) { ... } } } 。此外,Java中的数组从索引0开始,因此它应如下所示:

{{1}}

答案 3 :(得分:1)

Java中的数组是从零开始的,尝试从0迭代到b1-1:

for(int i=0; i<b1; i++)
{
    for(int j=0; i<b2; j++)
    {
        for(int k=0; i<b3; k++)
        {
          System.out.print("Enter element->");
          threedarray[i][j][k]=sc.nextInt();
        }
    }
}

答案 4 :(得分:0)

[b1][b2][b3]

使用输入b1b2b3

创建数组

创建的数组长度为bx,但从0下标到bx-1。因此,您必须从0循环到bx-1

答案 5 :(得分:0)

指数从0开始,而不是1。在for开始您的三个0循环,并迭代到比提供的数字少一个:

for(int i = 0; i < b1; i++)
{
    for(int j = 0; i < b2; j++)
    {
        for(int k = 0; i < b3; k++)
        {
          System.out.print(" "+threedarray[i][j][k]);
        }
    }
}

答案 6 :(得分:0)

除了数组索引问题(参见Stefan Beike's answer)之外,您还可以ArrayList

这样可以避免向用户询问矩阵中要包含的元素数量。

如果你想保留原始数组,你可以使用System.arrayCopy重新分配到更大的数组。

答案 7 :(得分:0)

这里的问题是你分别从1开始循环到b1,b2,b3。数组索引从0开始而不是从1开始,以数组的大小结束 - 1.因此,要修复代码,您需要将代码修改为以下内容:

for(int i = 0; i < b1; i++) {
  for(int j = 0; j < b2; j++) {
    for(int k = 0; k < b3; k++) {
      System.out.print("Enter element->");
      threedarray[i][j][k]=sc.nextInt();
    }
  }
}

更一般地说,如果您不知道要循环的数组的长度/大小,则可以使循环更一般地小于数组长度。所以它将是我&lt; threedarray.length和j&lt; threedarray [i] .length和k&lt; threedarray [i] [j]。长度。

关键的想法是数组索引从0开始并以其大小/长度结束 - 1,因此要获取最后一个元素,您访问数组[array.length-1]并访问第一个访问数组的元素[ 0]

希望这能回答你的问题。

相关问题