2014-02-17 3 views
0

Я написал следующий код в JAVA.ArrayIndexOutOfBoundsException при печати 3D-массива в 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(); 

Может ли кто-нибудь помочь мне, где произошла ошибка? Спасибо.

+0

В Java индексы массива начинаются от 0 до (n-1), где 'n' - длина массива. –

ответ

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 в каждом из них.

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

, затем остановка с индексом bx -1 –

0

[b1][b2][b3]

Вы создаете массив, используя входы b1, b2, b3

Массив создан имеет длину bx но подстрочные от 0 к bx-1. Следовательно, вы должны петля из 0 в bx-1

1

Я думаю, что вы хотите j и k в 2 внутри for петель вместо i. Кроме того, массивы в Java начинаются в индекс 0, поэтому он должен выглядеть следующим образом:

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

Массивы в Java с нуля, попытаться итерацию от 0 до В1-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(); 
     } 
    } 
} 
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]); 
     } 
    } 
} 
0

Помимо проблемы с индексом массива (см. Stefan Beike's answer), вы можете найти ArrayList.

Это позволит избежать необходимости запрашивать у пользователя количество элементов, которые вы хотите иметь в своей матрице.

Если вы хотите сохранить примитивные массивы, вы можете использовать System.arrayCopy для перераспределения в массив большего размера.

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(); 
    } 
    } 
} 

В целом, если вы не знаете, длина/размер массива, который вы зацикливаете, вы можете сделать цикл в целом меньше длины массива. Таким образом, это будет i < threedarray.length и j < threedarray [i] .length и k < threedarray [i] [j] .length.

Основная идея состоит в том, что индексирование массива начинается с 0 и заканчивается его размером/длиной - 1, поэтому для получения последнего элемента вы получаете доступ к массиву [array.length-1] и для доступа к первому элементу, к которому вы обращаетесь к массиву [0]

Надеюсь, это отвечает на ваш вопрос.

Смежные вопросы