2014-02-17 54 views
0

我在JAVA中編寫了以下代碼。在JAVA中打印3D數組時發生ArrayIndexOutOfBoundsException

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]

創建使用輸入b1b2陣列,b3

創建的陣列具有bx長度,但標從0bx-1。因此,你必須從循環到0bx-1

1

我想你想在2內for循環,而不是ijk。此外,在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迭代到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(); 
     } 
    } 
} 
0

指數從0開始,而不是1。在0開始你的三個for循環和重複,以一個數小於提供:

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

更普遍的,如果你不知道要循環的數組的長度/大小,可以使循環更一般地小於數組長度。所以這將是我< threedarray.length和j < threedarray [i] .length和k < threedarray [i] [j] .length。

關鍵的想法是,數組索引從0開始並以大小/長度-1結束,以便獲取訪問數組[array.length-1]的最後一個元素並訪問您訪問數組的第一個元素[0]

希望這回答你的問題。