2017-04-01 55 views
0

我是新來的編程初始化後空,我在我的代碼中的問題。 我首先將Maze對象初始化爲null,因爲我不知道哪個是用戶的選擇。它在createMaze()方法中初始化,但當我調用printMaze時,它是null。對象是一個方法

import java.util.Scanner; 

public class Main { 
    public static final String EXITGAME = "EXIT"; 
    public static final String PRINTBOARD = "PRINT"; 
    public static final String CREATEMAZE = "UPLOAD"; 

    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     Maze maze = null; 

     menu(maze,in); 
    } 

    private static void menu(Maze maze, Scanner in){ 
     String option = in.nextLine(); 
     while(option.toUpperCase() != EXITGAME){ 
      switch(option.toUpperCase()){ 
       case PRINTBOARD: printMaze(maze); break; 
       case CREATEMAZE: createMaze(in,maze); break; 
      } 
      System.out.println(); 
      option = in.nextLine(); 
     } 
    } 

    private static void printMaze(Maze maze){ 
     if(maze != null){ 
      int maxX = maze.getxSize(); 
      int maxY = maze.getySize(); 

      for(int x = 0; x < maxX; x++){ 
       for(int y = 0; y < maxY; y++){ 
        System.out.print(maze.getMazeRepresentation(x, y)); 
       } 
       System.out.println(); 
      } 
     } 
     else 
      System.out.println("Maze is undefined"); 
    } 

    private static void createMaze(Scanner in, Maze maze){ 
     if(maze == null || !maze.getGameStatus()){ 
      int x = in.nextInt(); 
      int y = in.nextInt(); 
      in.nextLine(); 
      char rawMaze[][] = new char[x][y]; 

      maze = new MazeClass(x,y); 

      for(int i = 0; i < x; i++){ 
       createMazeLine(in,i,y, rawMaze); 
      } 
      maze.createMaze(rawMaze); 
     } 
     else 
      System.out.println("Maze already defined."); 
    } 

    private static void createMazeLine(Scanner in, int lines, int y, char[][] rawMaze){ 
     String line = in.nextLine();  

     for(int i = 0; i < y; i++){ 
      rawMaze[lines][i] = line.charAt(i); 
     } 
    } 
} 
+0

您做錯了。您應該利用Java的[OO](https://www.tutorialspoint.com/java/java_object_classes.htm)性質。從用戶那裏獲得迷宮的所有輸入,然後,當用戶輸入一個命令來初始化迷宮時,然後製作迷宮對象。 – cdaiga

+0

如何,我需要等待要UPLOAD – Jffp

回答

0

在Java中,當你傳遞參數的方法(即迷宮迷宮createMaze(Scanner in, Maze maze)它是參照迷宮值 在你的情況,換句話說:

  • 有一個空值。
  • 存在對空參考稱爲空
  • 在調用該引用傳遞的方法值
  • (讓說的地址)作爲pramemter
  • 在方法調用中有一個參數變量,它保存該引用的值

Java沒有「通過引用參數」或指針概念。

所以,createMaze你做maze = new MazeClass(x,y);

分配新對象迷宮參照基準參數變量的方法內部時。

但是,您的初始空值和方法外的引用保持不變,並且您在方法完成後銷燬方法內部創建的對象。

總之,你需要的是:

private static void menu(Maze maze, Scanner in){ 
    String option = in.nextLine(); 
    while(option.toUpperCase() != EXITGAME){ 
     switch(option.toUpperCase()){ 
      case PRINTBOARD: printMaze(maze); break; 
      case CREATEMAZE: maze = createMaze(in,maze); break; 
     } 
     System.out.println(); 
     option = in.nextLine(); 
    } 
} 

private static Maze createMaze(Scanner in, Maze maze){ 
    if(maze == null || !maze.getGameStatus()){ 
     ... yuor code ... 
     maze.createMaze(rawMaze); 
    } 
    else 
     System.out.println("Maze already defined."); 

    return maze; 
} 

當然代碼可以在更明確的風格寫的,但主要的一點是

新值賦值給方法的參數裏面的方法呢不會替換在調用者中作爲參數傳遞的變量值

+0

命令所以現在我不能回去,以主,因爲我就失去了迷宮的對象,是正確的?非常感謝... – Jffp

+0

是的。如果你想主要做同樣的事情。我的意思是返回新的迷宮主要以及。 – Vadim

+0

還有另一種技術。你不能替換對象,但你可以改變它的屬性。所以,你可以擁有一個擁有迷宮財產的持有者。然後,您可以在任何地方爲其分配新的迷宮,並且您可以將持有者下到堆疊中,並且不會從任何方法返回迷宮。這意味着你可以在第一次嘗試時做到這一點,但是持有者不會迷路 – Vadim

相關問題