如何在不设置尺寸的情况下初始化2D阵列?

时间:2014-11-06 18:56:24

标签: java file-io multidimensional-array

我使用的方法是读入文件并根据前3行设置2D数组的大小。我的方法返回一个Room[][]对象,该方法还设置Room[][]对象的维度,以便在执行该方法之前无法将其设置为外部。例如:

public Room[][] readRooms(String filepath) throws IOException
    {
        int numberOfRooms;
        int numRows;
        int numCols;
        Room[][] grid;

    try
    {
        FileReader fr = new FileReader(filepath);
        BufferedReader br = new BufferedReader(fr);
        String next = null;

        numberOfRooms = Integer.parseInt(br.readLine());
        numRows = Integer.parseInt(br.readLine());
        numCols = Integer.parseInt(br.readLine());

        grid = new Room[numRows][numCols];

        while((next = br.readLine()) != null)
        {
            //do stuff
        }
    }
    catch{ //catch stuff }

return grid;
}

我正在尝试在另一个类的main方法中创建一个新的Room [] []对象:

Room[][] maze = readRooms(myfilepath);

然而,Java要求在我可以像这样使用迷宫之前定义迷宫。如果没有明确声明维度,是否无法初始化2D数组?

编辑:那些要求的主要方法:

public static void main(String args[])
{
    Room[][] maze;
    maze = readRooms("C:/Users/Blaise/Programming/csc300/Maze");
}

3 个答案:

答案 0 :(得分:1)

错误是您的功能readRooms不是static。设为static并且您不需要Room的实例来调用它。但您确实需要处理来电者IOException(或将throws IOException添加到main()

public static Room[][] readRooms(String filepath) throws IOException

此外,您不能双重声明maze的类型。

public static void main(String args[])
{
  Room[][] maze;
  try {
    maze = Room.readRooms("C:/Users/Blaise/Programming/csc300/Maze");
  } catch (IOException e) {
    e.printStackTrace();
  }
}

public static void main(String args[]) throws IOException
{
  // Room[][] maze; // <-- not
  Room[][] maze = Room.readRooms("C:/Users/Blaise/Programming/csc300/Maze");
}

答案 1 :(得分:0)

数组的大小始终在Java中固定。所以你不能....通常不使用数组,你在这里使用List的实现 - 通常是ArrayList,但有很多其他的选择。

当然,您可以从列表中创建一个数组作为最后一步 - 或者只是更改方法的签名以返回列表以

开头

答案 2 :(得分:0)

您的主要需要抛出IOException或将maze = readRooms(myfilepath)括起来:

try {...} catch (IOException) {...}

你也两次宣布迷宫。而不是写

Room[][] maze;
Room[][] maze = readRooms(myfilepath);

将其缩短为

Room[][] maze = readRooms(myfilepath);
像伊兰说的那样。或者,如果你真的不喜欢这样,那就做:

Room[][] maze;
maze = readRooms(myfilepath);

和Elliot也是对的,readRooms()需要是静态的。

我不知道我是否回答了你的问题,但至少这是一些建设性的批评:)。

编辑:我注意到你的readRooms方法中有try {...} catch {...} ...这用于捕获IOException吗?如果是这样,readRooms()根本不需要抛出IOException。