3维数组索引超出范围

时间:2013-11-24 15:01:41

标签: java arrays indexoutofboundsexception multidimensional-array

这是我的第一个问题。我正在尝试编写一个程序,读取从键盘输入的数组。输入列数后,我得到错误:线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:0

提前致谢。

package Final;

import java.util.*;

public class Final {
    int a,b,x,l;
    double mat[][][];

    Final()
    {
        a=0;
        b=0;
        c=0;
        d=0;
        x=0;
        l=0;
    }

    public void read() {
        Scanner citast = new Scanner(System.in);
        System.out.println("How many arrays do you want to enter?");
        x=citast.nextInt();
        for (this.l=0; this.l<x; this.l++)
        {
              System.out.println("Matrix "+this.l);
              System.out.println("Number of lines: ");
              this.a = citast.nextInt();
              System.out.println("Number of columns: ");
              this.b = citast.nextInt();
              this.mat= new double [this.l][a][b];
              for (int i=0; i<this.a; i++)
               {
                  for (int j=0; j<this.b; j++)
                   {
                      System.out.print("Matrice " + l + " ["+ i +"]["+ j +"]= ");
                      this.mat[l][i][j]=citast.nextInt();
                   }
                  System.out.println();
            }
        }
    }

    public static void main(String[] args) {
        Final a = new Final();
        Scanner citast = new Scanner(System.in);
        a.read();
        System.out.println();

}

}

3 个答案:

答案 0 :(得分:4)

this.mat= new double [this.l][a][b];

应该是:

this.mat= new double [x][a][b];

但是你的代码错了,你应该在第一个for循环之前设置数组的维度:

public void read() {
        Scanner citast = new Scanner(System.in);
        System.out.println("How many arrays do you want to enter?");
        x=citast.nextInt();
        this.mat = new double[x][][]; //<-- added this line
        for (this.l=0; this.l<x; this.l++)
        {
            System.out.println("Matrix "+this.l);
            System.out.println("Number of lines: ");
            this.a = citast.nextInt();
            System.out.println("Number of columns: ");
            this.b = citast.nextInt();
            this.mat[l] =  new double [a][b]; //<-- modified this line
            for (int i=0; i<this.a; i++)
                for (int j=0; j<this.b; j++)
                {
                    System.out.print("Matrice " + l + " ["+ i +"]["+ j +"]= ");
                    this.mat[l][i][j]=citast.nextInt();
                }
            System.out.println();
        }
        System.out.println(Arrays.deepToString(mat));
    }

包含2个方阵的数组的输出(一个填充4个,一个填充5个):

[[[4.0, 4.0], [4.0, 4.0]], [[5.0, 5.0], [5.0, 5.0]]]

答案 1 :(得分:1)

这应该有效。 首先,您创建一个大小为x的数组,以容纳任意大小的二维数组。 然后,为每个l创建一个大小为a x b的二维数组,将其放在l的{​​{1}}位置,并将值读入其中

mat

答案 2 :(得分:0)

for (int j=0; j<this.b; j++)
    {
        System.out.print("Matrice " + l + " ["+ i +"]["+ j +"]= ");
        this.mat[l][i][j]=citast.nextInt();
    }

如果你离开

this.mat[l][i][j] = citast.nextInt(); 

出于它,然后它正在工作。

此外,你必须使Final()静态并在你的类中声明c和d,因为它们在构造函数中,但是在类中没有对它们的引用。