Java 从其他类调用方法时出错

Java 从其他类调用方法时出错,java,swing,Java,Swing,从另一个类调用refresh()方法时出错 public void refresh() { repaint(); } refresh()位于JFrame中,我从普通类调用它。错误是一个空指针,它位于我的级别。refresh(),以及public void refresh()。 我试图做的是工作完全正常,但我得到了这个错误 Player class`package entity.player; import java.awt.Image; import java.awt.event.K

从另一个类调用refresh()方法时出错

public void refresh() {
    repaint();
}
refresh()
位于
JFrame
中,我从普通类调用它。错误是一个空指针,它位于我的
级别。refresh()
,以及
public void refresh()
。 我试图做的是工作完全正常,但我得到了这个错误

Player class`package entity.player;

import java.awt.Image;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

import level.Level;

public class Player {
public static Image playerImgLeft = new ImageIcon(
        "resources/Player/left/player_anim1_left.png").getImage();
public static Image playerImgRight = new ImageIcon(
        "resources/Player/right/player_anim1_right.png").getImage();
public static Level levelp;
public int x = 0;
public int y = 0;
public int dy = 0;
public int dx = 0;
// Direction = right
public int direction = 0;

public Player() {
    x = 10;
    y = 10;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public Image getImageLeft() {
    return playerImgLeft;
}

public Image getImageRight() {
    return playerImgRight;
}

public void move() {
    x = x + dx;
    y = y + dy;

}

public void keyPressed(KeyEvent key) {
    if (key.getKeyCode() == KeyEvent.VK_A) {
        dx = -1;
        direction = 1;
        System.out.println("left");

        levelp.refresh();

    }
    if (key.getKeyCode() == KeyEvent.VK_D)
        dx = 1;
    direction = 0;

    if (key.getKeyCode() == KeyEvent.VK_W)
        dy = -1;

    if (key.getKeyCode() == KeyEvent.VK_S)
        dy = 1;

}

public void keyReleased(KeyEvent key) {

    if (key.getKeyCode() == KeyEvent.VK_A)
        dx = 0;

    if (key.getKeyCode() == KeyEvent.VK_D)
        dx = 0;

    if (key.getKeyCode() == KeyEvent.VK_W)
        dy = 0;

    if (key.getKeyCode() == KeyEvent.VK_S)
        dy = 0;

}
}

级别类别:

package level;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

import entity.player.Player;

public class Level extends JPanel implements ActionListener {

private static final long serialVersionUID = 1L;
public static int level = 0;
Player player;
public Timer time;
public Image img;

public Level() {
    this.setVisible(true);
    setFocusable(true);
    player = new Player();
    this.addKeyListener(new LevelKeyListener());
     ImageIcon i = new ImageIcon("");
     img = i.getImage();

    time = new Timer(5, this);
    time.start();
}

public void actionPerformed(ActionEvent e) {
    player.move();

    repaint();
    revalidate();
}

public void refresh () {
    repaint();
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);


    Graphics2D g2d = (Graphics2D) g;

     g.drawImage(img, 0, 0, null);
     if(player.direction == 0) {
    g2d.drawImage(player.getImageRight(), player.getX(), player.getY(), null);
     } else if(player.direction == 1) {
         g2d.drawImage(player.getImageLeft(), player.getX(), player.getY(),    null);

     }

}

private class LevelKeyListener extends KeyAdapter {

    public void keyPressed(KeyEvent e) {
        player.keyPressed(e);
    }

    public void keyReleased(KeyEvent e) {
        player.keyReleased(e);
    }
}
}

`

正如所怀疑的那样,您的
levelp
变量没有指向任何内容(即
null

当您查看这一行时,您将看到您正试图对一个实际上没有引用任何内容的变量调用
refresh()
方法:

levelp.refresh();
它刚刚被宣布为

public static Level levelp;
没有任何实际创建
级别
对象的代码(因此:您试图对指向
null
的引用调用方法)

尝试创建一个立即对象,如下所示:

public static Level levelp = new Level();

我还鼓励您通读一遍,以便了解
NullPointerException
s是如何以及何时发生的

如果看不到更多的代码,我们无法判断。堆栈跟踪也会有帮助。如果堆栈跟踪发生在
level.refresh()
的行上,则您的
level
对象很可能为空。如果堆栈跟踪可能是重复的,请向我们展示更多,这样我们就可以知道如何帮助您了——但不要太多,让我们淹没在不相关的代码中。是的,在这里提问是一项习得的技能,因此你最好开始改进你的技能。我刚刚添加了代码。*Epic fail*我想当我调用新级别()时,它会创建一个新的JPanel。我不敢苟同。levelp字段绝对不应该是静态字段@user3234092:您应该进行此更改,将其更改为实例字段。