【问题标题】:I get the error "AWT-EventQueue-0" java.lang.NullPointerException and i do not understand why in my context我收到错误“AWT-EventQueue-0”java.lang.NullPointerException,我不明白为什么在我的上下文中
【发布时间】:2014-01-09 01:28:01
【问题描述】:

我正在制作一个游戏,并且有一个课程可以打印屏幕上的所有内容。我在这一行收到一个错误: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;
}


}

【问题讨论】:

  • 你的方法ch.setPoint();ch.setImage();,应该是get吗?
  • @JavaDevil 是的,他们应该得到,对不起,我有时对他们感到困惑。他们只是获取角色的点并获取角色的图像
  • 好的,你可以发布你的角色类吗?
  • 是的,正如我所怀疑的那样。 Character 的默认构造函数没有设置任何 Character 字段。在您的打印机或默认构造函数中调用另一个构造函数
  • @JavaDevil 这可以让内容完美显示而没有错误谢谢,但唯一的问题是它不会让我再移动我的图像了。我刚刚将 this(50,50,3,300,169) 添加到我的角色构造函数中。那么按下按钮时不应该使用 keyListener 并调用 moveIt 方法吗?

标签: java nullpointerexception


【解决方案1】:

确保您的 chImage 实际上是 Image。换句话说,一个简单的测试是打印到System.out 这里是一个例子:

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

如果 chImage 在输出中打印类似AwtImage@17089 的内容,则加载它。如果 if 在那个地方说 null,则没有加载的 Image。如果发生这种情况,请检查您的图像路径,或者图像名称是否拼写正确。

【讨论】:

  • 但是,如果 Image 为空,则不会发生任何事情。不抛出 NPE
  • 我像你说的那样输入了一个打印语句,它打印出 null 所以它不在那里。在我的字符类中,图像在图像变量中,但是当我尝试将其发送到打印机类(上面的类)时,它不存在。我有一个简单的public BufferedImage getImage(){ return image; },但它似乎不起作用
  • 如果您尝试返回一个图像,或许可以尝试将其转换为一个 BufferedImage。查看您的返回类型。它说缓冲图像。此外,除了image 这个词你什么都没有,所以它不会做任何事情。这是方法之外的BufferedImage 吗?
【解决方案2】:

您如何对所有这些都做一些简单的 if(component == null) 。这样你就可以看到其中哪些是空的。在我看来,这是一个非常直接的解决方案。

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

【讨论】:

    【解决方案3】:

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

    这表明您的观点 imageP 尚未设置。

    我在你的打印机方法中看到你有

    ch = new Character();
    imageP = ch.getPoint();
    chImage = ch.getImage();
    

    因此,Character 的默认构造函数不会设置点和图像(或 Character 类中的任何内容),因此您的 getter 将返回 null,这意味着该点为 null。

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

    在打印机中执行此操作

    ch = new Character(0,0,1,10,10); //Or what ever defaults
    imageP = ch.getPoint();
    chImage = ch.getImage();
    

    在 Character 中启用更改您的默认构造函数

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 2012-10-01
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多