Home > Software design >  I don´t understand why this call does not work (Java)
I don´t understand why this call does not work (Java)

Time:05-06

The class Maze instanciates an 2D boolean-Array with the method: generateMaze(int width, int height) which has to be used in Walker. The method-call to create the boolean[][] happens at the main of the Walker class

My aim is to call the boolean[ ][ ]-Array with walk(Maze maze),the input for the method has to be the Maze-Object, not the actual boolean[ ][ ]. I do not understand how to call it, there has to be a way to call it with an object instance of an Maze-Object.

public final class Maze{

    public static boolean[][] generateMaze(int width, int height) {

        boolean[][] mazeArray = new boolean[width][height];

        for( int x = 0; x < width; x   ) {
            mazeArray[x][0] = true;
        }
        for( int y = 0; y < height; y   ) {
            mazeArray[0][y] = true;
        }
        return mazeArray;
    }

    public boolean[][] getBooleanArray() {
        return generateMaze(2,2);
    } 
}
public class Walker {

    public static void main(String[] args) {
        boolean[][] maze = Maze.generateMaze(2,2);

        Walker walker = new Walker();
        Maze mazeObj  = new Maze();

        walker.walk( mazeObj );
    }

    public void walk(Maze maze) {
        // This call doesnt work. Why?
        System.out.println( mazeObj.maze[0][0] );
    }
}

CodePudding user response:

Looks like your Maze class does not have a field maze. Also looks like you are attempting to access some variable mazeObj in your walk method when the only parameter is Maze maze

Maybe you wanted this?

System.out.println(maze.getBooleanArray()[0][0]);

CodePudding user response:

Pretty much everything is wrong with the provided code, as far as what I think you are trying to achieve boolean[][] maze should be a instance variable for your maze objects, getBooleanArray() is completely redundant, and the work you want done when initializing a new object should be under the constructor. Additionally the final declaration for Maze class does't really make sense in this context, but I can't comment on that as I don't know about the rest of your program.

A possible fix with explanations is provided below:

public class Maze{

    /** Declare a new mazeArray instance variable (variables that are
     *  attributes of specific instances of the class). It is common to
     *  declare the instance variables private and manage access via
     *  public accessor methods. See below for the accessor method.
     */
    private boolean[][] mazeArray;
    
    /** Move the contents of the generateMaze to the constructor,
     *  constructors are called when a new object is being instantiated.
     *  (basically when you call new <ClassName>()), you do not have to
     *  return the mazeArray anymore as it will be accessed via an
     *  accessor method.
     */
    public Maze(int width, int height) {

        mazeArray = new boolean[width][height];

        for( int x = 0; x < width; x   ) {
            mazeArray[x][0] = true;
        }
        for( int y = 0; y < height; y   ) {
            mazeArray[0][y] = true;
        }    
    }

    /** This is the accessor method that will be 
     *  used by the outside world to access
     *  the mazeArray field
     */
    public getMazeArray() {
        return mazeArray;
    }
}

also the Walker class is faulty in the way that in terms of object oriented programming.

public class Walker {

    public static void main(String[] args) {

        /* Calling new Maze() create a Maze object with the private
         * boolean[][] mazeArray that you can access with the same
         * object's getMazeArray() method.
         */
        Maze maze = new Maze();

        walk(maze);

    }
    /** I don't know if you will have multiple Walker objects in your
     *  program, depending on that decision you might want to make this
     *  method non-static but for now this will suffice
     */
    public static walk(Maze maze) {

      boolean[][] mazeArray = maze.getMazeArray();

      System.out.println(mazeArray[0][0]);

    }
}

Also you don't seem to be using Java properly, and as someone who was at the same place a couple of years ago I would recommend Head First Java as a good place to start reading. Also you might want to linearize your 2D array to prevent later performance issues depending on where your project is headed.

  • Related