NullPointerException nie wiadomo gdzie

0

Witajcie, panowie! (i panie też)
Otóż pojawia mi się wyjątek NullPointerException i nie mam bladego pojęcia, dlaczego (jak to ja - niby brunet, ale jednak blondynka). Pracuję nad kodem już od długiego czasu, więc zrobił się taki rozwięzły, że trudno go tu zmieścić, dlatego pójdę lekko na łatwiznę i dam wam tylko jedną klasę:

package MainPackage;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;
import stg.Frame;
import stg.Position;
import stg.Tool;

public final class Game extends JPanel {
    public Game() {
        MarioSocial main = new MarioSocial();
        main.logged();
        game = main.getFrame();
        Sprite test = new Sprite(tool.getImage("src/MainPackage/icon.gif"), new Position(0, 0, 16, 16), 0);
        drawSprite(test, g);
    }
    public void drawSprite(Sprite s, Graphics g) {
        super.paintComponent(g);
        Image i = s.getImage();
        int x = s.getX();
        int y = s.getY();
        int w = s.getWidth();
        int h = s.getHeight();
        g.drawImage(i, x, y, w, h, null);
    }
    private Frame game;
    private Tool tool = new Tool();
    private Graphics g;
}

Wyjątek wywołuje tutaj linijka super.paintComponent(g). Z powodu moich zabaw z Graphics g wnioskuję, że to o niego chodzi.

Czy da się łatwo uleczyć tego potworka, czy wywalić cały kod i zacząć od nowa?

PS: A propos "public final class", bez "final" program w ogóle nie chce się odpalić.

3

Jeśli naprawdę nie wiesz dlaczego pojawia się NPE, to jesteś blondynka do kwadratu.


import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;
import stg.Frame;
import stg.Position;
import stg.Tool;
 
public final class Game extends JPanel {
    public Game() {
        MarioSocial main = new MarioSocial();
        main.logged();
        game = main.getFrame();
        test = new Sprite(tool.getImage("src/MainPackage/icon.gif"), new Position(0, 0, 16, 16), 0);
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        drawSprite(g);
    }
    public void drawSprite(Graphics g) {
        Image i = test.getImage();
        int x = test.getX();
        int y = test.getY();
        int w = test.getWidth();
        int h = test.getHeight();
        g.drawImage(i, x, y, w, h, null);
    }
    private Frame game;
    private Tool tool = new Tool();
    private Sprite test;
}
1

Widać nawet obrazek o rozmiarach 1x1.
Uruchom debugger, albo dopisz własny debugger.

    public void drawSprite(Graphics g) {
        Image i = test.getImage();
        int x = test.getX();
        int y = test.getY();
        int w = test.getWidth();
        int h = test.getHeight();
        System.out.println("x="+x+" y="+y+" w="+w+" h="+h);
        System.out.println(i);
        g.drawImage(i, x, y, w, h, null);
    }
0
 public Game() {
        MarioSocial main = new MarioSocial();
        main.logged();
        game = main.getFrame();
        test = new Sprite(tool.getImage("src/MainPackage/icon.gif"), new Position(0, 0, 16, 16), 0);
    }

@bogdans pomogłeś z tym komentarzem: klasa "od logowania", gdy sprawdzi, że podano poprawny login i hasło, tworzy nowy obiekt Game, który wykonuje w klasie MarioSocial metodę logged(), jednak nic dodaje panelu do ramki, wobec czego mała przeróbka jednej z linijek na:

main.logged(this);

A w metodzie logged(Game g):

frame.add(g);

i wszystko działa jak należy. Wielkie dzięki, panowie, do zobaczenia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1