![](/img/trans.png)
[英]I got Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException Error. What should I do?
[英]I get the error “AWT-EventQueue-0” java.lang.NullPointerException and i do not understand why in my context
我正在做一個游戲,有一堂課可以打印屏幕上的所有內容。 我在這條線上收到錯誤: 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;
}
}
確保您的chImage
實際上是Image
。 換句話說,一個簡單的測試將是打印到System.out
這是一個示例:
System.out.println("chImage: " + chImage);
如果chImage在輸出中輸出類似AwtImage@17089
,則將其加載。 如果在該位置說null,則沒有加載的Image。 檢查您的圖像路徑是否發生,或者圖像名稱拼寫正確。
您如何對所有這些對象執行一些簡單的if(component == null)。 這樣,您可以看到其中哪個為空。 我認為這是一個非常簡單的解決方案。
那或者您調試代碼並通過調試器檢查變量的內容。
NullPointerExcpetion最有可能來自語句imageP.x*scale
和imageP.y*scale
。 如果該點為空,則嘗試訪問x和y將拋出NPE。
這表明未設置您的點imageP
。
我在您的打印機方法中看到
ch = new Character();
imageP = ch.getPoint();
chImage = ch.getImage();
因此,您默認的Character
構造函數不會設置點和圖像(或Character類中的任何內容),因此您的吸氣劑將返回null,這意味着該點為null。
您需要調用完成所有這些操作的Character類的構造函數,或者在默認構造函數內, 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);
}
只是關於獲取器和設置器的注釋:
具有這些名稱的方法的約定會使這些方法的類型為void
並接受類似以下的參數:
public void setPoint(Point p)
{
this.characterPoint = p;
}
然后,這將給您帶來編譯錯誤,就好像您嘗試調用set
方法並將其分配給變量一樣,那么您就知道出了點問題。
如果按照約定,它們應該是getPoint()
,則它們不會花費太多時間,但會返回某種類型的對象,例如
public Image getImage()
{
return this.characterImage;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.