1

Java Maze アプリケーションを Android に移植する作業を行っています。これが意味することは、与えられた Java コードを使用して (この部分は作成していません)、一部のクラスを書き直しています (つまり、Java グラフィックスを Android グラフィックスに変更して Android で動作するようにし、Android UI アクティビティを作成しています)。 (私は完了しました)。

プログラムを実行すると、次の行が例外の原因であると不平を言う NullPointerException が発生します。

maze.newMaze(root, cells, dists, startx, starty);

これはエラーです:

01-19 19:22:53.157: E/AndroidRuntime(638): FATAL EXCEPTION: Thread-79
01-19 19:22:53.157: E/AndroidRuntime(638): java.lang.NullPointerException
01-19 19:22:53.157: E/AndroidRuntime(638):  at falstad.MazeBuilder.run(MazeBuilder.java:729)
01-19 19:22:53.157: E/AndroidRuntime(638):  at java.lang.Thread.run(Thread.java:856)

エラー行は明らかに MazeBuilder の run メソッドにあり、「迷路」が null であり、パラメーターが有効であることがわかりました。また、Mazebuilder の build メソッドで maze が null に設定されていることもわかりました...これは、Maze オブジェクトを通過し、maze = mz (迷路) を設定します。

したがって、mazebuilder.build(...) が呼び出される Maze.java で見つけ、メソッド maze.build() AT THE BOTTOM で「this」をパラメーターとして使用します。

    /**
 * Method obtains a new Mazebuilder and has it compute new maze, 
 * it is only used in keyDown()
 * @param skill level determines the width, height and number of rooms for the new maze
 */
private void build(int skill) {
    // switch screen
    state = STATE_GENERATING;
    redraw();
    // select generation method
    switch(method){
    case 1 : mazebuilder = new MazeBuilderPrim(); // generate with Prim's algorithm
    break ;
    case 0: // generate with Falstad's original algorithm (0 and default), note the missing break statement
    default : mazebuilder = new MazeBuilder(); 
    break ;
    }
    // adjust settings and launch generation in a separate thread
    mazew = skill_x[skill];
    mazeh = skill_y[skill];
    int roomcount = skill_rooms[skill];
    mazebuilder.build(this, mazew, mazeh, roomcount, skill_partct[skill]);
    // mazebuilder calls back by calling newMaze() to return newly generated maze
}

これを読むと、パラメーター 'this' が null であることがわかります。Javaの「this」関数について読んだことがありますが、まだ理解していないため、なぜnullなのかわかりません。また、問題の一部は、私が持っているためだと推測しています

mazebuilder = new MazeBuilder()

ではない

mazebuilder = new MazeBuilder(this)

「this」パラメーターを追加しようとすると (上記のコード行のように)、コンストラクター MazeBuilder(Maze) が未定義であると怒鳴られます。しかし、私の GeneratingActivity GA は Maze maze とは異なるタイプです...明らかに、GA = maze を設定するコンストラクターを作成できません...混乱しています。

繰り返しになりますが、ご協力とご忍耐に感謝いたします。これは初心者にとって悪夢でした。

4

1 に答える 1

3

newMazeBuilder現在のアクティビティ コンテキストを次のように渡すには、クラスのパラメーター化されたコンストラクターを作成する必要があります。

    public class newMazeBuilder{
    public Context context;

    public newMazeBuilder(Context context){
      this.context=context;
    }

    ///now we context instead of this for passing Context to other components 

    private void build(int skill) {
         // your code here....
        mazebuilder.build(context, mazew, mazeh, roomcount, skill_partct[skill]);

    }

}

newMazeBuilderActivity に class オブジェクトを次のように作成します。

newMazeBuilder mazebuilder = new newMazeBuilder(Your_Current_Activity.this);
于 2013-01-22T02:22:20.660 に答える