Java NullPointerException при использовании super.paintComponent (g); in public void paintComponent () {}

Я экспериментировал с графикой в ​​java, но когда я попытался запустить свой код, он дал мне ошибку NullPointerException в строке с paintComponent(g); в ней. Я пытался установить Graphics g в методе paintComponent, и я создал вражеский сценарий, который был почти таким же, но все еще не работал. Я проверил в Интернете, но там был только один, и они использовали поток, полностью меняющий структуру этого кода. вот исключение:

Exception in thread "main" java.lang.NullPointerException
    at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:800)
    at com.arena.game.food.paintComponent(food.java:12)
    at com.arena.game.food.<init>(food.java:27)
    at com.arena.game.Game.foodSpawn(Game.java:8)
    at com.arena.game.Game.main(Game.java:24)

Вот фактический код:

package com.arena.game;
import java.util.*;
import java.util.concurrent.TimeUnit;

public class Game {
    public static void foodSpawn(int diff, int w, int h, Window W) {
        while(true) {
            W.newFood(new food(diff,w,h));
            try {TimeUnit.MILLISECONDS.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}
        }
    }
    public static void main(String[] args) {
        Random ran = new Random();
        int width = 300;
        int height =  300;
        int diff = 1;
        int squareS = 100;
        int x = width/2-squareS/2;
        int y = height/2-squareS/2;
        int velx = ran.nextInt(15)+1;
        int vely = ran.nextInt(15)+1;
        Enemy f = new Enemy(squareS);
        Window win = new Window(width,height,f);
        foodSpawn(diff,width,height,win);
        while(true) {
            if (x >= width-squareS || x<=0) {velx=-velx; diff++; velx++; x=x+velx;} else {x=x+velx;}
            if (y >= height-squareS || y<=0) {vely=-vely; diff++; vely++; y=y+vely;} else {y=y+vely;}
            f.newxy(x,y);
            width = Window.newW();
            height = Window.newH();
        }
    }
}
package com.arena.game;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
public class Window extends JFrame{
    int x = 0;
    int y = 0;
    public static int getW;
    public static int getH;
    public void newFood(food f) {
        super.add(f);
    }
    public Window(int width,int height,Enemy f) {
        getW = width;
        getH = height;
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        super.add(f);
        super.setSize(width, height);
        super.setVisible(true);
        super.getContentPane().addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                Component c = (Component)e.getSource();
                int W = c.getWidth();
                int H = c.getHeight();
                getW = W;
                getH = H;
            }
        });
    }

    public static int newW() {
        return getW;
    }
    public static int newH() {
        return getH;
    }
}
package com.arena.game;
import java.awt.*;
import javax.swing.*;
import java.util.concurrent.TimeUnit;

public class Enemy extends JPanel{
    int x;
    int y;
    int SquareS;
    public Enemy(int SquareS) {
        this.SquareS = SquareS;

    }
    public void newxy(int x,int y) {
        this.x = x;
        this.y = y;
        try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}
        paintComponent(this.getGraphics());
    }
    public void paintComponent(Graphics g) {
            super.paintComponent(g);
            this.setBackground(Color.BLUE);
            g.setColor(Color.RED);
            g.fillRect(x, y, SquareS, SquareS);
    }
}
package com.arena.game;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.util.concurrent.TimeUnit;

public class food extends JPanel{
    Random ran = new Random();
    int x;
    int y;
    public void paintComponent(Graphics g ,int Score) {
        super.paintComponent(g); // ERROR LINE
        g.setColor(Color.GREEN);
        g.fillRect(x, y, Score, Score);
    }
    public food(int Difficulty,int Wid,int Hei) {

        int Score = ran.nextInt(ran.nextInt(Difficulty)+1);
        x = ran.nextInt(Wid)+1;
        y = ran.nextInt(Hei)+1;
        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();y 
        }
        paintComponent(this.getGraphics(),Score);
    }
}

Извините, я не смог дать небольшой отрывок. (Я не знал, в чем проблема на самом деле), поскольку я все еще новичок в java и java-графике и все еще привыкаю к ​​этому типу кода

Как вы писали, получается исключение. Не могли бы вы добавить это исключение в свой пост? Спасибо.

Korashen 27.09.2018 11:22

вы должны, по крайней мере, предоставить трассировку стека (и вы должны иметь возможность ее прочитать, она точно скажет вам, в какой строке возникает проблема)

Stultuske 27.09.2018 11:23

Добавлю что сейчас

Dragsaw Dragon 27.09.2018 11:23

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

Korashen 27.09.2018 11:28

нет, пока нет, так как я не знаком с отладкой, необходимой в java-графике, но я попробую это сейчас

Dragsaw Dragon 27.09.2018 11:30

да, это ноль

Dragsaw Dragon 27.09.2018 11:31

Но я не знаю, как сделать его не нулевым ...

Dragsaw Dragon 27.09.2018 11:36

не вызывайте paintComponent в конструкторе, экземпляр еще не создан полностью

Stultuske 27.09.2018 11:43

Итак, как мне это назвать?

Dragsaw Dragon 27.09.2018 11:46

Я давно не работал со свингом. Но разве не было какого-то метода onDraw или onPaint, который вызывается, когда компонент фактически отображается на экране? Вы можете перезаписать его, поскольку вы наследуете от JPanel.

Korashen 27.09.2018 12:19

Вместо прямого вызова paintComponent() позвоните в repaint(). Это приведет к перерисовке компонента в правильном графическом потоке. Он будет иметь графический объект для передачи методу paintComponent().

Frecklefoot 25.10.2018 17:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
11
51
1

Ответы 1

Я переписал ваш класс Food, и теперь он работает. А для правильной Java должен быть Food, а не food:

package com.arena.game;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.util.concurrent.TimeUnit;

public class Food extends JPanel{
    Random ran = new Random();
    int x;
    int y;
    private int _score = 0;

    @Override
    public void paintComponent( Graphics g ) {
        super.paintComponent(g); // ERROR LINE
        g.setColor(Color.GREEN);
        g.fillRect(x, y, _score, _score);
    }

    public Food(int Difficulty,int Wid,int Hei) {

        _score = ran.nextInt(ran.nextInt(Difficulty)+1);
        x = ran.nextInt(Wid)+1;
        y = ran.nextInt(Hei)+1;
        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace(); 
        }
        repaint();
    }
}

Другие вопросы по теме