2013-01-22 3 views
1

Я работаю над переносом приложения Java Maze на Android. Это означает, что я беру код Java, данный мне (я не писал эту часть), переписывая некоторые из классов (например, меняя графику Java на графику Android, чтобы она работала на Android, и я создаю активность в Android UI (который я закончил)NullPointerException при переносе игры на Android

Когда я запускаю свою программу, я получаю 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) 

Ошибка ошибки в MazeBuil der, и я понял, что «лабиринт» имеет значение null и параметры действительны. Я также выяснил, что лабиринт установлен в null в методе сборки Mazebuilder ... который проходит через объект Maze и устанавливает maze = mz (лабиринт).

Так я нахожу в Maze.java где называется mazebuilder.build (...), и это в методе maze.build() в нижней части с «этим» в качестве параметра:

/** 
* 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 и не понимаю ее, поэтому я не уверен, почему она равна нулю. Я также предполагаю, часть проблемы заключается в том, что, поскольку у меня есть

mazebuilder = new MazeBuilder() 

и не

mazebuilder = new MazeBuilder(this) 

При попытке добавления «этот параметр» (как выше строки кода), это у меня коды ответчика о конструктор MazeBuilder (Maze) не определен. Но моя GenerationActivity GA отличается от лабиринта Maze ... так что я не могу создать конструктор, который устанавливает GA = лабиринт ... Я в замешательстве.

Снова, я очень ценю любую помощь и терпение. Это был кошмар для новичка.

+0

попробовать проходящие GeneratingActivity.this – seaplain

+4

' это' * никогда * null. Никогда, никогда. Я гарантирую это. – Eric

+0

Возможно ли, что вы передаете «null» для любого из параметров «cells, dists, startx, starty». Например, 'startx' является' int', но код передает целое число, которое равно null. В результате распаковки будет получено исключение NullPointerException – JScoobyCed

ответ

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]); 

    } 

} 

Создать newMazeBuilder объект класса в деятельности, как:

newMazeBuilder mazebuilder = new newMazeBuilder(Your_Current_Activity.this); 
+0

Ок, я думаю, я понимаю, что вы говорите @ ρяσѕρєя K. Но то, что вы написали, немного запутывает меня, потому что класс MazeBuilder НЕ является активностью, это стандартный класс java. Исправьте меня, если я ошибаюсь, но для контекста характерен андроид, так что this.context ничего не сделает в классе nonActivity в этом случае, потому что говорит 'newMazeBuilder mazebuilder = new newMazeBuilder (Your_Current_Activity.this);' будет бросать ошибка, поскольку мы не находимся в Activity ... – Cadre

+0

@Cadre: plz предоставляет больше кода для класса java и Activity, чтобы сделать его более понятным.если MazeBuilder не является классом Activity, тогда перейдите в контекст Activity, как «MazeBuilder mazebuilder = new MazeBuilder (Your_Current_Activity.this);». в моем ответе я просто даю вам решение или способ, с помощью которого можно передать контекст Activity в класс non Activity –

Смежные вопросы