2012-06-29 3 views
-1

Можно создать дубликат:
How to avoid this NullPointerExceptionNullPointerException Избежание

Я на самом деле задал этот вопрос раньше, но я должен был изменить его, и я думаю, что я был слишком поздно, потому что никто не ответил после этой точки ,

Я работаю над маленькой аркадной видеоигрой, и я ищу двойной буфер для улучшения анимации. У меня есть один класс, который должен нарисовать пустое изображение, и еще один класс, который должен нарисовать простую строку. Тем не менее, я постоянно получаю NullPointerException на линии, где линия, как предполагается, будет обращено

class Render extends JPanel { 
    public int dbWidth = 500, dbHeight = 400; 
    public Image dbImage = null; 
    public Graphics dbg; 

    public void gameRender() { 

     if(dbImage == null) 
      dbImage = createImage(dbWidth, dbHeight); 

     dbg = dbImage.getGraphics(); 
     dbg.setColor(Color.white); 
     dbg.fillRect(0, 0, dbWidth, dbHeight); 
    } 
} 

class MC extends Render { 
    public Render render = new Render(); 

    public void draw() { 
     render.gameRender(); 
     dbg.drawLine(100, 100, 200, 200); // line where NullPointerException occurs 
    } 
} 

Я предполагаю, что это переменная Графика DBG это нуль, но он получает значение dbImage.getGraphics(); в gameRender(); Как я могу исправить эту NullPointerException ?

Я также вызов метода Жеребьевка() в другом классе, как этот

public void run() { 

    running = true; 

    while(running) { 

     mc.draw(); 
     try { 
      Thread.sleep(50); 
     } 
     catch(Exception e) {} 
    } 
} 

Я сказал в конструктор этого класса, что тс = новый MC();

+1

Опубликовать трассировку стека ... – m0skit0

+0

У вас уже есть хорошие ответы на ваш вопрос. Зачем спрашивать другого? – gobernador

+1

http://stackoverflow.com/questions/11263199/how-to-avoid-this-nullpointerexception – kullalok

ответ

3

класс MC расширяет класс Render. Это означает, что MC наследует Renderdbg. Вам не нужно создавать другой экземпляр Render. Попробуйте вместо этого:

class MC extends Render { 

    public void draw() { 
     super.gameRender(); 
     dbg.drawLine(100, 100, 200, 200); // line where NullPointerException occurs 
    } 
} 
1

Вы имеете дело с двумя экземплярами Render здесь: есть render поля в вашем MC классе, и с тех пор MC сами проходит Render, есть еще один неявный экземпляр есть. Когда вы делаете:

render.gameRender(); 

вы звоните gameRender на экземпляре, который инициализирует render.dbg, но тогда, когда вы звоните dbg.drawLine вы используете MC сек экземпляр dbg, которая еще не инициализирован.

В этом случае, вы действительно не нужно наследование, так просто render поля будет делать:

public void draw() { 
    render.gameRender(); 
    render.dbg.drawLine(100, 100, 200, 200); 
} 

Кроме того, это не хорошая практика, чтобы сделать поле общественности, поэтому рассмотрите возможность добавления поглотителя для dbg в Render:

public Graphics getGraphics() { 
    return dbg; 
} 

... 

render.getGraphics().drawLine(100, 100, 200, 200); 

или делегировать drawLine вызов:

public void drawLine(int x1, int y1, int x2, int y2) { 
    dbg.drawLine(x1, y1, x2, y2); 
} 

... 

render.drawLine(100, 100, 200, 200); 
0

Я предполагаю, что ваш метод draw вызывается средой рисования java перед вызовом конструктора.

Поместите одну точку останова внутри конструктора и одну точку останова внутри draw(), чтобы проверить это.

Если это правда, просто окружайте оператор draw с помощью if, чтобы проверить! = Null.Конечно, это обходной путь, но, возможно, это помогает вам.

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