Java 我得到了这个错误;AWT-EventQueue-0“;我不明白为什么在我的上下文中

Java 我得到了这个错误;AWT-EventQueue-0“;我不明白为什么在我的上下文中,java,nullpointerexception,Java,Nullpointerexception,我正在制作一个游戏,并且有一个类来打印屏幕上的所有内容。我在这一行得到了一个错误:g.drawImage(chImage,imageP.x*scale,imageP.y*scale,null)是因为我在它的末尾有null吗?我已经查找了这个错误,并试图找出它,我知道该行中的某些内容是空的,但我无法找出什么是空的或如何修复它。如果你需要我发布其他课程,我可以。从我的谷歌搜索到目前为止,我认为这可能与我的变量初始化方式有关 package Game; import java.awt.Graphic

我正在制作一个游戏,并且有一个类来打印屏幕上的所有内容。我在这一行得到了一个错误:
g.drawImage(chImage,imageP.x*scale,imageP.y*scale,null)是因为我在它的末尾有null吗?我已经查找了这个错误,并试图找出它,我知道该行中的某些内容是空的,但我无法找出什么是空的或如何修复它。如果你需要我发布其他课程,我可以。从我的谷歌搜索到目前为止,我认为这可能与我的变量初始化方式有关

package Game;

import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.JPanel;

public class Printer extends JPanel{
private Map map;
private Character ch;
private int scale;
private Point imageP;
private BufferedImage chImage;
private ArrayList<Rectangle> part;

public Printer(int scale1){
    scale = scale1;
    map = new Map();
    ch = new Character();
    imageP = ch.getPoint();
    chImage = ch.getImage();
    part = map.setPart();
}


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

    g.drawImage(chImage, imageP.x*scale, imageP.y*scale, null);

    for(int i=0; i<part.size(); i++){
        Rectangle temp = new Rectangle(part.get(i));
        g.drawRect(temp.x, temp.y, temp.width, temp.height);
        g.fillRect(temp.x, temp.y, temp.width, temp.height);
    }


}

}


package Game;

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

//Creates a image for a character and allows him to walk around the screen
public class Character extends JPanel{

private BufferedImage image;
private Point imageP;
private int speed;
private int scale;
private int width;
private int height;

public Character(){

}

public Character(int x, int y, int scale1, int w, int h){
   super();
   try {
        image = ImageIO.read(new File("F:\\Programming\\Final Project\\Top_down\\narwhal.png"));
   } catch (IOException ex) {

   }
   scale = scale1;
   imageP = new Point(x,y);
   speed = 10;
   width = w;
   height = h;
   addKeyListener(new KeyAdapter(){
       @Override
   public void keyPressed(KeyEvent evt){
           moveIt(evt);
       }
   });
}


public void moveIt(KeyEvent evt){
    switch(evt.getKeyCode()){
    case KeyEvent.VK_S:
        if(imageP.y <= height-33)
            imageP.y += 1*speed;
        break;
    case KeyEvent.VK_W:
        if(imageP.y >=0+5)
            imageP.y -= 1*speed;
        break;
    case KeyEvent.VK_A:
        if(imageP.x >=0+5)
            imageP.x -= 1*speed;
        break;
    case KeyEvent.VK_D:
        if(imageP.x <= width-30)
            imageP.x += 1*speed;
        break;
    }
    repaint();
}


public Point getPoint(){
    //g.drawImage(image, imageP.x*scale, imageP.y*scale, null);  IGNORE THIS
    return this.imageP;
}

public BufferedImage getImage(){
    return this.image;
}


}
打包游戏;
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.Rectangle;
导入java.awt.image.buffereImage;
导入java.util.ArrayList;
导入javax.swing.JPanel;
公共类打印机扩展JPanel{
私人地图;
私人性质;
私有整数规模;
专用点成像;
私有缓冲区映像池映像;
私有数组列表部分;
公用打印机(int scale1){
比例=比例1;
map=新map();
ch=新字符();
imageP=ch.getPoint();
chImage=ch.getImage();
part=map.setPart();
}
受保护组件(图形g){
超级组件(g);
g、 drawImage(chImage,imageP.x*比例,imageP.y*比例,空);
对于(int i=0;i=0+5)
imageP.x-=1*速度;
打破
case KeyEvent.VK_D:

if(imageP.x对它们做一些简单的if(component==null)怎么样。这样你就可以看到它们中的哪一个是null。在我看来,这是一个非常直接的解决方案


或者您调试代码并通过调试器检查变量的内容。

对所有变量执行一些简单的if(component==null)操作如何。这样您就可以看到它们中的哪一个是null。在我看来,这是一个非常直截了当的解决方案


或者您调试代码并通过调试器检查变量的内容。

对所有变量执行一些简单的if(component==null)操作如何。这样您就可以看到它们中的哪一个是null。在我看来,这是一个非常直截了当的解决方案


或者您调试代码并通过调试器检查变量的内容。

对所有变量执行一些简单的if(component==null)操作如何。这样您就可以看到它们中的哪一个是null。在我看来,这是一个非常直截了当的解决方案


或者您调试代码并通过调试器检查变量的内容。

确保您的
chImage
实际上是一个
图像。
。换句话说,一个简单的测试就是打印到
系统。out
以下是一个示例:

    System.out.println("chImage: " + chImage);

如果chImage在输出中打印类似
AwtImage@17089
,然后它被加载。如果在该位置显示null,则没有加载的图像。如果出现这种情况,请检查图像路径,或者检查图像名称拼写是否正确。

确保您的
chImage
实际上是一个
图像。换句话说,是一个简单的test将打印到
系统。out
以下是一个示例:

    System.out.println("chImage: " + chImage);

如果chImage在输出中打印类似
AwtImage@17089
,然后它被加载。如果在该位置显示null,则没有加载的图像。如果出现这种情况,请检查图像路径,或者检查图像名称拼写是否正确。

确保您的
chImage
实际上是一个
图像。换句话说,是一个简单的test将打印到
系统。out
以下是一个示例:

    System.out.println("chImage: " + chImage);

如果chImage在输出中打印类似
AwtImage@17089
,然后它被加载。如果在该位置显示null,则没有加载的图像。如果出现这种情况,请检查图像路径,或者检查图像名称拼写是否正确。

确保您的
chImage
实际上是一个
图像。换句话说,是一个简单的test将打印到
系统。out
以下是一个示例:

    System.out.println("chImage: " + chImage);

如果chImage在输出中打印类似
AwtImage@17089
,然后它被加载。如果在该位置显示null,则没有加载的图像。如果出现这种情况,请检查图像路径,或者检查图像名称拼写是否正确。

NullPointerException很可能来自语句
imageP.x*scale
imageP.y*scale
。如果该点为空,则尝试访问x和y将抛出NPE

这表明未设置点
imageP

我从你的打印机方法中看出了你的缺点

ch = new Character();
imageP = ch.getPoint();
chImage = ch.getImage();
因此,
字符的默认构造函数
没有设置点和图像(或字符类中的任何内容),因此getter将返回null,这意味着点为null

您需要调用执行所有这些操作的角色类的构造函数,或者在默认构造函数
Character()
中使用一些默认值调用另一个构造函数

要么在打印机中这样做

ch = new Character(0,0,1,10,10); //Or what ever defaults
imageP = ch.getPoint();
chImage = ch.getImage();
在字符中更改默认构造函数

public Character(){
    this(0,0,1,10,10);
}

请注意getter和setter:

具有这些名称的方法的约定将使这些方法的类型为
void
,并接受如下参数:

public void setPoint(Point p)
{
    this.characterPoint = p;
}
这将给您一个编译错误,就像您试图调用
set
方法并将其赋值为变量,那么您就知道有问题了

按照惯例,如果它们是
getPoint()
,它们将不会获取一个agrument,而是返回一个类似

public Image getImage()
{
    return this.characterImage;
}

NullPointerException很可能来自语句
imageP.x*scale
imageP.y*scale
。如果该点为null,则尝试访问x和y将抛出NPE

这表明未设置点
imageP

我从你的打印机方法中看出了你的缺点

ch = new Character();
imageP = ch.getPoint();
chImage = ch.getImage();
因此
字符的默认构造函数不会设置点和图像(或字符类中的任何内容),因此getter将返回null,即点