2014-11-06 2 views
1

파일을 읽고 처음 세 줄을 기준으로 2D 배열의 크기를 설정하는 방법을 사용하고 있습니다. 내 메서드는 Room[][] 개체를 반환하며이 메서드는 Room[][] 개체의 크기를 설정하므로 메서드를 수행하기 전에 외부로 설정할 수 없습니다. 예를 들어 :치수를 설정하지 않고 2D 배열을 어떻게 초기화합니까?

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[][] maze = readRooms(myfilepath); 

을, 자바는 그 미로를 요구하고 내가 이것을 이렇게 사용할 수 있기 전에 정의되어야한다. 명시 적으로 차원을 선언하지 않고 2D 배열을 초기화 할 수 있습니까?

편집 : 그 묻는위한 주요 방법 :

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

'maze'가 정의 된 코드를 보여주고, 선호하면 [MCVE] (http://stackoverflow.com/help/mcve). 또한 정확한 오류 메시지를 알려주십시오. – Radiodef

답변

1

오류가 함수 readRooms이다는 static 없습니다. static으로 설정하면 Room 인스턴스를 호출 할 필요가 없습니다. 하지만 당신은

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

또한, 당신이 maze의 타입을 선언 더블 수없는 발신자의 IOException을 처리 할 필요가 (또는 main()throws IOException 추가) 않습니다.

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

그건 내 부분에서 오류 였어. 원래 코드에서 내 코드에서 이중으로 선언되지는 않았지만 디버깅을 시도했을 때 나는 문제의 시점에서 작업했던 내용을 복사했다. – Blaise

0

배열의 크기

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

또는는 항상 자바로 고정되어 있습니다. 그래서 당신은 할 수 없습니다. 일반적으로 배열을 사용하는 대신 List의 구현을 사용합니다. 일반적으로 ArrayList이지만 다른 많은 대안을 사용할 수 있습니다.

당신은 마지막 단계로 목록에서 배열을 만들 물론 수

-에

0

주요 요구로 시작 하나 던져 IOException를 또는 maze = readRooms(myfilepath)을 둘러싸고 목록을 반환하거나 메소드의 서명을 변경 로 : 또한

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

당신은 두 번 미로를 선언하고 있습니다. 에 란 말했듯이 대신

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

를 작성하는

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

로 줄이십시오.

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

와 엘리엇 오른쪽도 readRooms() 필요가 정적하는 것입니다 : 당신이 정말 마음에 들지 않는 경우 또는 수행.

귀하의 질문에 답변했는지 여부는 알 수 없지만 적어도 건설적인 비판입니다. :)

편집 : readRooms 메소드에 try {...} catch {...}이 있다는 것을 알았습니다 ... IOException을 catch하는 데 사용됩니까?그렇다면 readRooms()은 IOException을 전혀 발생시키지 않아도됩니다.

+1

아니요, catch는 별도의 예외 사항입니다. – Blaise

관련 문제