“无法找到符号”/“无法从静态上下文引用非静态变量”

时间:2018-06-11 17:40:45

标签: java

public class Main {
    public static void main(String[] args){ 
        create("Maze.txt");
    }

}

public class Maze {
    private final int Max_Maze_Row=20;
    private final int Max_Maze_Column=50;
    public char[][] maze =new char[Max_Maze_Column-1][Max_Maze_Row-1];


    public Maze(){

    }

    public void create(String filename) throws FileNotFoundException{
        Scanner fileinput=new Scanner(new FileInputStream(filename));
        fileinput.useDelimiter("");

        while(fileinput.hasNextLine()){
            int row=0;int col=0;
            String line_content=fileinput.nextLine();
            for(col=0;col<Max_Maze_Column;col++){
                maze[row][col]=line_content.charAt(col);
            }
            row++;
            fileinput.close();

        }

        System.out.println(maze);
    }

}

所以基本上,我正在尝试创建一个Maze类,它将从文本文件中读取20x50迷宫的内容(这将存储在2d数组中)。 我定义了方法create,它将在迷宫内容中读取并创建2D数组。 我有它的代码,我认为这是正确的。 但是,当我在main函数中调用create方法时,我得到“找不到符号”错误。此外,一旦我使create()方法静态,我得到非静态变量错误。为什么会这样? 任何关于错误的帮助或我的创建方法的提示将不胜感激。 谢谢。

4 个答案:

答案 0 :(得分:0)

create不是静态的,因此您需要Maze的实例,例如:

  new Maze().create("Maze.txt");

请注意,通常每个类都在不同的java文件中。

答案 1 :(得分:0)

在调用该类方法之前,必须创建该类的对象。像这样:

public class Main {
    public static void main(String[] args) {
        Maze maze = new Maze();
        maze.create("Maze.txt");
    }
}

答案 2 :(得分:0)

有几件事&#34;错误&#34;使用您的代码示例,但大多数是关于样式,模式等,而不一定是技术问题。

正如其他人所说,您需要创建Maze类型的新对象才能调用create()方法。

另一方面,为什么要调用no-arg构造函数,然后调用init方法(此处称为create)从磁盘加载迷宫。相反,为什么不使用Maze构造函数来获取文件名并加载迷宫?

如果我正在设计这个类,我可能会改为声明create方法:

public static Maze load(String filename)

此方法将实例化一个新的Maze对象,用数据填充它,然后将其返回给调用者。我喜欢这个&#34;工厂模式&#34;因为您可能希望以不同的方式实现Maze。工厂方法比构造函数更灵活,因为工厂方法允许您返回所需的具体Maze子类,您可以稍后改变主意。调用构造函数会锁定您使用该特定类。

与创建Maze对象并调用其init方法的方法完全无关,您可能总是在最大允许值下分配char[][]数组,从而分配比所需更多的堆内存尺寸。不是在对象构建时立即分配内存,也许你应该等到你知道迷宫有多大。

如果迷宫文件说它是一个10x10迷宫,你仍然在分配49x20字符数组,这比实际需要的要多得多。

没有特别的理由Maze构造函数不应该接受迷宫的大小作为参数,然后只根据需要分配尽可能多的内存。

看到MAX_SIZE这样使用很奇怪:

new char[MAX_SIZE - 1][MAX_SIZE - 1]

为什么减去1?通常,您会看到这样的分配:

new char[MAX_SIZE][MAX_SIZE]

然后像这样进行范围检查:

if(x <= maze.length - 1)
    // x is in range

if(x < maze.length)
    // x is in range

我希望这有助于您建立更好的Maze课程。

答案 3 :(得分:-1)

尝试,

public class Main {
    public static void main(String[] args){ 
        **Maze.**create("Maze.txt");
    }

}

public class Maze {
    private final int Max_Maze_Row=20;
    private final int Max_Maze_Column=50;
    public char[][] maze =new char[Max_Maze_Column-1][Max_Maze_Row-1];


    public Maze(){

    }

    public **static** void create(String filename) throws FileNotFoundException{
        Scanner fileinput=new Scanner(new FileInputStream(filename));
        fileinput.useDelimiter("");

        while(fileinput.hasNextLine()){
            int row=0;int col=0;
            String line_content=fileinput.nextLine();
            for(col=0;col<Max_Maze_Column;col++){
                maze[row][col]=line_content.charAt(col);
            }
            row++;
            fileinput.close();

        }

        System.out.println(maze);
    }

}