2017-04-01 93 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

相关问题