Java.lang.NullPointerException

23 respostas
rajinha92

Olá, estou tendo o seguinte erro na linha 56 do Scenario.java, não consegui achar o erro!
Obrigado desde já

23 Respostas

Rodrigo_Sasaki

Por que não posta as classes aqui entre as tags ? Tem gente que não vai poder baixar isso, por estar no trabalho.

rajinha92

Desculpe, eu tinha achado extensas pra postar, mas vamos lá

Scenario.java

package principal;

import GameLib.Gfx;
import GameLib.Sentido;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Scenario extends JPanel implements Runnable {

    private ImageIcon fundo = null;
    private Thread gameThread;
    private int x = 0;
    private int speed = 4;
    private Image sprImg;
    private Gfx gfx;
    private boolean isRunning = true;
    
    public Scenario(){
        
    }
    
    public boolean isIsRunning() {
        return isRunning;
    }

    public void setIsRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }
    
    public void Init(){
        gfx = new Gfx(this, getFundo().getImage());
        gfx.setSentido(Sentido.DIREITA);
        sprImg = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/resources/picture.gif"));
    }
    
    public void start(){
        if (gameThread == null){
            gameThread = new Thread(this);
            gameThread.start();
        }
    }
    
    public void stop(){
        if (gameThread != null){
            gameThread.interrupt();
            gameThread = null;
        }
    }
    
    public void paint(Graphics g){
        gfx.cls();
        gfx.drawImage(sprImg, x, 45);
        gfx.refresh();
    }
    
    public void update(Graphics g){
        paint(g);
    }

    public ImageIcon getFundo() {
        return fundo;
    }

    public void setFundo(String caminho) {
        this.fundo = new ImageIcon(getClass().getResource(caminho));
    }
    
    public void checkSentido(){
        switch(gfx.getSentido()){
                case DIREITA:
                    x += speed;
                case ESQUERDA:
                    x -= speed;
            }
        if (x > getWidth()){
            gfx.setSentido(Sentido.ESQUERDA);
            checkSentido();
        } else if (x < 0){
            gfx.setSentido(Sentido.DIREITA);
            checkSentido();
        }
    }

    @Override
    public void run() {
        
        while(isRunning){
            checkSentido();            
            repaint();
            
            try{
               gameThread.sleep(40); 
            } catch (InterruptedException e){}
        }
    }
}

Gfx.Java

package GameLib;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;

/**
 *
 * @author Rafael
 */
public class Gfx {

    private Component comp;
    private Image offImage, offBGImage;
    private Graphics offG;
    private Sentido sentido = Sentido.PARADO;

    public void setSentido(Sentido sentido) {
        this.sentido = sentido;
    }

    public Sentido getSentido() {
        return sentido;
    }

    public Gfx(Component component, Color color) {

        comp = component;
        offImage = comp.createImage(comp.getWidth(), comp.getHeight());
        offBGImage = comp.createImage(comp.getWidth(), comp.getHeight());

        Graphics bgG = offBGImage.getGraphics();
        bgG.setColor(color);
        bgG.fillRect(0, 0, comp.getWidth(), comp.getHeight());

        offG = offImage.getGraphics();
    }

    public Gfx(Component component, Image backImg) {

        comp = component;
        offImage = comp.createImage(comp.getWidth(), comp.getHeight());
        offBGImage = backImg;

        offG = offImage.getGraphics();
    }

    public void drawImage(Image img, int x, int y) {
        offG.drawImage(img, x, y, comp);
    }

    public void cls() {
        offG.drawImage(offBGImage, 0, 0, comp);
    }

    public void refresh() {
        comp.getGraphics().drawImage(offImage, 0, 0, comp);
    }

    public void setBGImage(Image backImg) {
        offBGImage = backImg;
    }

    public Image getBGImage() {
        return (offBGImage);
    }

    public void cls(Color color) {
        offG.setColor(color);
        offG.fillRect(0, 0, comp.getWidth(), comp.getHeight());
    }

    public Image getOffImage() {
        return (offImage);
    }
}
ErickRAR

gfx não está instanciado( e se você está recebendo um Graphcs por parametro, deveria usa-lo, né?).

Rodrigo_Sasaki

bom, sua variável gfx está com valor null quando você tenta utilizá-la.

Esse seu método é estranho, pois você envia um argumento que nunca é utilizado.

rajinha92

O graphics do paint é só pra sobrescrever o método, eu achei que o new Gfx() no método Init istanciaria minha variavel.

Rodrigo_Sasaki

Ele instancia, mas você invoca ele antes de invocar o outro ?

rajinha92

O método Init não deveria ser chamado antes do paint?

Rodrigo_Sasaki

Não sei, aonde você viu que deveria?

rajinha92

eu imaginei que fosse o método que inicia os componentes, então foi engano meu, vou tentar arrumar aqui, vlw pela ajuda cara
Abraços

rajinha92

Chamar o método Init() no construtor da classe não seria uma boa ideia né?
tentei fazer isso só pra ver se funcionaria e deu problema no new Gfx()

Rodrigo_Sasaki

É, como ainda está no construtor acho que não dá certo enviar o this

rajinha92

O que seria mais indicado de fazer para contornar meu problema?

Rodrigo_Sasaki

Não sei, você poderia ocultar o construtor e criar um método estático para retornar a instância, mas como não sei qual é o seu caso não sei se é a melhor solução.

rajinha92

o problema é que eu rodo tudo num loop pra executar as ações em tempo real, se eu chamar um método que crie a instancia de um outro método como o paint() isso pode fazer com que ele fique recriando a instancia dentro do laço ai vai ficar esquisito! vou pensar numa solução, assim que achar posto aqui

Rodrigo_Sasaki

Não precisa, você pode controlar as instâncias no método estático, pode criar um Singleton caso seja o que a situação pede.

rajinha92

tem como me dar um exemplo?

Rodrigo_Sasaki
Lembrando que nem sempre Singleton é a melhor solução, a maioria das vezes existe um Pattern que é melhor aplicável, mas segue só um exemplo.
public class Singleton{

    private Singleton me;

    private Singleton(){} // Construtor privado sem argumentos

    public static Singleton getInstance(){
        if(me == null){
            me = new Singleton();
        }
        return me;
    }

}
rajinha92

mas no meu caso que eu preciso passar os parametros pro construtor do Gfx pra poder criar meu fundo certinho, isso não funcionaria, certo?

Rodrigo_Sasaki

Claro que sim, o getInstance é um método como outro qualquer, você pode passar argumentos pra ele, e depois passar os mesmos para o construtor, caso queira.

rajinha92

Cara, desculpe o transtorno, mas sou novato nessa parte e não estou conseguindo aplicar o que me falou no meu código, o getInstance, tem que ser para minha classe Scenario ou para Gfx?

Rodrigo_Sasaki

No caso eu creio que para o Scenario, para que você possa invocar o construtor e em seguida o método init, mas essa solução parece gambiarra hehehe

rajinha92

Creio que minha cabeça não esteja funcionando hoje, hehe
vou postar o código de novo, pra ver qual besteira estou fazendo, mas acho que não compreendi bem como usar o getInstance();

Scenario.java

package principal;

import GameLib.Gfx;
import GameLib.Sentido;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Scenario extends JPanel implements Runnable {

    private ImageIcon fundo = null;
    private Thread gameThread;
    private int x = 0;
    private int speed = 4;
    private Image sprImg;
    private Gfx gfx;
    private boolean isRunning = true;
    
    public Scenario(){
        Init();
    }
    
    public void Init(){
        gfx = Gfx.getInstance(this, Color.BLACK);
        gfx.setSentido(Sentido.DIREITA);
        sprImg = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/resources/picture.gif"));
    }
   
    public boolean isIsRunning() {
        return isRunning;
    }

    public void setIsRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }

    public void start() {
        if (gameThread == null) {
            gameThread = new Thread(this);
            gameThread.start();
        }
    }

    public void stop() {
        if (gameThread != null) {
            gameThread.interrupt();
            gameThread = null;
        }
    }

    public void paint(Graphics g) {
        gfx.cls();
        gfx.drawImage(sprImg, x, 45);
        gfx.refresh();
    }

    public void update(Graphics g) {
        paint(g);
    }

    public ImageIcon getFundo() {
        return fundo;
    }

    public void setFundo(String caminho) {
        this.fundo = new ImageIcon(getClass().getResource(caminho));
    }

    public void checkSentido() {
        switch (gfx.getSentido()) {
            case DIREITA:
                x += speed;
            case ESQUERDA:
                x -= speed;
        }
        if (x > getWidth()) {
            gfx.setSentido(Sentido.ESQUERDA);
            checkSentido();
        } else if (x < 0) {
            gfx.setSentido(Sentido.DIREITA);
            checkSentido();
        }
    }

    @Override
    public void run() {

        while (isRunning) {
            checkSentido();
            repaint();

            try {
                gameThread.sleep(40);
            } catch (InterruptedException e) {
            }
        }
    }
}

Gfx.java

package GameLib;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;

/**
 *
 * @author Rafael
 */
public class Gfx {

    private Component comp;
    private Image offImage, offBGImage;
    private Graphics offG;
    private Sentido sentido = Sentido.PARADO;
    private static Gfx me;
    private Gfx(){}
    
    public static Gfx getInstance(Component comp, Color color){
        if (me == null){
            me = new Gfx(comp, color);
        }
        return me;
    }
    
    public void setSentido(Sentido sentido) {
        this.sentido = sentido;
    }

    public Sentido getSentido() {
        return sentido;
    }

    public Gfx(Component component, Color color) {

        comp = component;
        offImage = comp.createImage(comp.getWidth(), comp.getHeight());
        offBGImage = comp.createImage(comp.getWidth(), comp.getHeight());

        Graphics bgG = offBGImage.getGraphics();
        bgG.setColor(color);
        bgG.fillRect(0, 0, comp.getWidth(), comp.getHeight());

        offG = offImage.getGraphics();
    }

    public Gfx(Component component, Image backImg) {

        comp = component;
        offImage = comp.createImage(comp.getWidth(), comp.getHeight());
        offBGImage = backImg;

        offG = offImage.getGraphics();
    }

    public void drawImage(Image img, int x, int y) {
        offG.drawImage(img, x, y, comp);
    }

    public void cls() {
        offG.drawImage(offBGImage, 0, 0, comp);
    }

    public void refresh() {
        comp.getGraphics().drawImage(offImage, 0, 0, comp);
    }

    public void setBGImage(Image backImg) {
        offBGImage = backImg;
    }

    public Image getBGImage() {
        return (offBGImage);
    }

    public void cls(Color color) {
        offG.setColor(color);
        offG.fillRect(0, 0, comp.getWidth(), comp.getHeight());
    }

    public Image getOffImage() {
        return (offImage);
    }
}
Matheus_Paiva

Exatamente

Criado 2 de outubro de 2012
Ultima resposta 2 de out. de 2012
Respostas 23
Participantes 4