簡體   English   中英

如何在不設置維度的情況下初始化二維數組?

[英]How do you initialize a 2D array without setting its dimensions?

我正在使用一種讀取文件並根據前 3 行設置二維數組大小的方法。 我的方法返回一個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");
}

錯誤是您的函數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");
}

數組的大小在 Java 中總是固定的。 所以你不能......通常不使用數組,而是在這里使用 List 的實現 - 通常是 ArrayList,但有很多其他可用的替代方法。

當然,您可以從列表中創建一個數組作為最后一步 - 或者只是更改方法的簽名以返回一個列表以開始

您主要需要拋出一個 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 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM