Проблема NullPointerException для краски и краскиКомпонент - PullRequest
0 голосов
/ 11 декабря 2018

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

Я пытаюсь преобразоватьсопоставление символов с 2D-плитками с использованием paint и paintComponent, и я продолжаю сталкиваться с NullPointerException в обоих из них, но я не могу найти, где я неправильно применяю нулевое значение, когда ему нужен объект.

Вот полный код:

(MapsBasic - это класс генератора карт, тогда как TileType - это просто класс, заполненный плиткой Image)

public class Launcher extends JFrame {

private BufferedImage Background
        = ImageIO.read(new FileInputStream("res/textures/background2.png"));
protected BufferedImage image
        = ImageIO.read(new FileInputStream("res/textures/floortileset.png"));
protected TileSet objectSet = new TileSet(image);
private MapsBasic meps = new MapsBasic();
private TileType type;
private char[] c = meps.getSymbolList();
private char[][] t = meps.getTiles();
// private Image dbImage;
private Graphics g;
private int width, height;

public Launcher() throws IOException {
    width = 480;
    height = 480;
    setTitle("GG RPG");
    setSize(width, height); //width and height in pixels
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public void paintComponent (Graphics g) {
    meps.getSymbolList();
    meps.generateDisplayRandomSymbols();

    for (int i = 0; i < meps.getSize(); i++) {
        for (int j = 0; j < meps.getSize(); j++) {
            if (t[i][j] == c[1]) {
                g.drawImage(type.enemy(), i * 32, j * 32, null);
            }
            if (t[i][j] == c[2]) {
                g.drawImage(type.npc(), i * 32, j * 32, null);
            }
            if (t[i][j] == c[0]) {
                g.drawImage(type.player(), i * 32, j * 32, null);
            } else {
                for (int k = 3; k < c.length; k++) {

                    if (c[k] == ';') {
                        g.drawImage(type.grass1(), i * 32, j * 32, null);
                    }
                    if (c[k] == '`') {
                        g.drawImage(type.grass2(), i * 32, j * 32, null);
                    }
                    if (c[k] == '.') {
                        g.drawImage(type.grass3(), i * 32, j * 32, null);
                    }
                    if (c[k] == ',') {
                        g.drawImage(type.grass4(), i * 32, j * 32, null);
                    }
                    if (c[k] == '^') {
                        g.drawImage(type.grass5(), i * 32, j * 32, null);
                    }
                    if (c[k] == '#') {
                        g.drawImage(type.grass6(), i * 32, j * 32, null);
                    }
                    if (c[k] == '*') {
                        g.drawImage(type.water(), i * 32, j * 32, null);
                    }
                    if (c[k] == '=') {
                        g.drawImage(type.desert(), i * 32, j * 32, null);
                    }
                }
            }
        }
    }

}

public void paint(Graphics g) {
    super.paint(g);
    g.setColor(Color.black);
    g.setFont(new Font("TimesRoman", Font.PLAIN, 14));
    g.drawImage(Background, 1, 1, 500, 500, null);
    g.drawString("Message", 180, 265);
    g.drawString("Message2 :)", 60, 280);

    //start game
    Scanner input = new Scanner(System.in);
    int wasd = input.next().charAt(0);
    if (wasd == 'y' || wasd == 'Y') {
        g.clearRect(0, 0, 480, 480);
    }

    //dbImage = createImage(getWidth(), getHeight());
    //g = dbImage.getGraphics();
    paintComponent(g);

}

И это сообщение об исключении:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ggrpg.Launcher.paintComponent(Launcher.java:61)
at ggrpg.Launcher.paint(Launcher.java:108)
at javax.swing.RepaintManager$4.run(RepaintManager.java:842)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

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

1 Ответ

0 голосов
/ 11 декабря 2018

Кажется, проблема в том, что вы никогда не инициализируете type.Поэтому всякий раз, когда вы вызываете type.enemy() или что-то еще, оно генерирует исключение NullPointerException, потому что type не было определено.

Решением было бы сделать что-то вроде private TileType type = new TileType();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...