【问题标题】:Errors in command prompt when loading and displaying images加载和显示图像时出现命令提示符错误
【发布时间】:2014-10-08 15:26:43
【问题描述】:

我正在开发我的第一个 Java 应用程序,一个游戏。 我现在编译的很好,但是当我在命令提示符下运行它时,命令提示符会重复打印:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException                   
at Spike.loadpic(Spike.java:50)                                                 
at Spike.paintspike(Spike.java:55)                                              
at Move.paint(Move.java:106)                                                    
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217)                
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1532)                                                                        
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1455)                                                                                      
at javax.swing.RepaintManager.paint(RepaintManager.java:1252)                   
at javax.swing.JComponent._paintImmediately(JComponent.java:5165)               
at javax.swing.JComponent.paintImmediately(JComponent.java:4976)                
at javax.swing.RepaintManager$3.run(RepaintManager.java:811)                    
at javax.swing.RepaintManager$3.run(RepaintManager.java:794)                    
at java.security.AccessController.doPrivileged(Native Method)                   
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)                                                                           
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:794)                                                                                        
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:769)                                                                                        
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:718)                                                                                     
at javax.swing.RepaintManager.access$1100(RepaintManager.java:62)               
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1680)                                                                                  
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)            
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)                   
at java.awt.EventQueue.access$400(EventQueue.java:97)                           
at java.awt.EventQueue$3.run(EventQueue.java:697)                               
at java.awt.EventQueue$3.run(EventQueue.java:691)                               
at java.security.AccessController.doPrivileged(Native Method)                   
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)                                                                           
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)                       
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)                                                                            
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)        

并且它不会启动应用程序(当我少加载一张图像时,它最终会停止并且确实可以工作)。

这些是我认为可能导致问题的代码部分:

        @SuppressWarnings("serial")
        public class Move extends JPanel implements Runnable {
        private synchronized void start(){
        if(running){
            return;
        }
        running = true;
        thread = new Thread(this);
        thread.start(); 
    }

    public void run(){
        private Thread thread;
        boolean running = false;
        long tijd = System.nanoTime();
        double ticks = 60.0;
        double ns = 1000000000/ticks;
        double delta=0;
        while(running){
            long tijd2 = System.nanoTime();
            delta+=(tijd2-tijd)/ns;
            tijd=tijd2;
            if(delta>1){
            player.move();
            for(int i=0;i<zappelin.length;i++){
            zappelin[i].movezappelin();
            }
            repaint();
            delta--;
                }
            }
        }
        @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;

        if(player.x<400){g2d.translate(0,0);}
        else if(player.x+400>levellength){g2d.translate(-levellength+800,0);}
        else{g2d.translate(-(player.x-400),0);}
        player.paintplayer(g2d);
        for(int i=0;i<ground.length;i++){
            ground[i].paintground(g2d);
        }
        for(int j=0;j<spike.length;j++){
            spike[j].paintspike(g2d);
        }
        for(int k=0;k<zappelin.length;k++){
            zappelin[k].paintzappelin(g2d);
        }
    }
        public static void main(String[] args){
        /*Set frame, create Move game, etc */
        game.start();
    }
        /*Some other stuff*/
        }

public class Player{
loaded=false;      
private void loadpic(){
        player[0] = new ImageIcon("Images/Playa.png").getImage();
        player[1] = new ImageIcon("Images/Playal.png").getImage();
        player[2] = new ImageIcon("Images/Playar.png").getImage();      
        loaded = true;
        game.repaint();
    }

public void paintplayer(Graphics2D g){
    if(!loaded){
        loadpic();
    }
     if(loaded){
        if(xa==-1){
            g.drawImage(player[1], x, y, null);
        }
        else if(xa==1){
            g.drawImage(player[2], x, y, null);
        }
        else{
        g.drawImage(player[0], x, y, null);
        }
     }
}
/*Other stuff*/
}

public class Zappelin{
private void loadpic(){
        zappelin[0] = new ImageIcon("Images/zappelinl.png").getImage();
        zappelin[1] = new ImageIcon("Images/zappelinr.png").getImage();
        zappelin[2] = new ImageIcon("Images/explosion.png").getImage();
        loaded = true;
        game.repaint();
    }
  public void paintzappelin(Graphics2D g) {
        if(dead){return;}
        if(!loaded){
            loadpic();
        }
        else{
            if(xaz==-1||xaz==0){g.drawImage(zappelin[0], xz, yz, null);}
            else{g.drawImage(zappelin[1],xz,yz,null);
                //g.drawImage(zappelin[2], 10,10, 64, 64, 0,0,64,64,null);
            }
        }
        if(bullet){
            g.setColor(Color.RED);
            g.fillOval(xbullet,ybullet,4,4);
        }
    }
/*Other stuff*/
}

public class Spike{
private void loadpic(){
        switch (dimension){
        case "normaal":     
            spike = new ImageIcon("Images/Spike.png").getImage();
            test=1337;
            break;

        case "links": 
            spike = new ImageIcon("Images/spikel.png").getImage();
            break;

        case "rechts": 
            spike = new ImageIcon("Images/spiker.png").getImage();
            break;

        case "boven": 
            spike = new ImageIcon("Images/spikeb.png").getImage();
            break;

        default: 
            spike = new ImageIcon("Images/Spike.png").getImage();
            break;
            }

        loaded = true;
        game.repaint(); 
    }
public void paintspike(Graphics2D g) {
        if(!loaded){
            loadpic();
        }
        else{
            if(dimension=="normaal"||dimension=="boven"){
                for(int i=0; i<amount;i++){
                    g.drawImage(spike, xg+15*i, yg, null);}
                }
            if(dimension=="links"||dimension=="rechts"){
                for(int i=0; i<amount;i++){
                    g.drawImage(spike, xg, yg+20*i, null);
                }
            }
        }
    }
}

我知道我应该使用 spritesheets 而不是单个图像,我会修复它,但我认为这不会完全解决这个问题(注释掉所有图像加载也不能解决它)。

我在任何地方都找不到解决方案,所以如果有人知道如何解决这个问题,那就太好了。

编辑:我尝试了一些事情,结果当我只使用 g.drawImage(image, x, y, null) 方法时,命令提示符最终会停止打印此错误并启动应用程序,但它会无限重复它当我使用 g.drawImage(image, dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,null) 方法时。

【问题讨论】:

  • 检查文件 Spike.java 中的第 50 行。你有一个空指针异常。
  • (1) - dimension=="normaal"(2) Images 文件夹是否在“工作目录”中?如果不是,那么您的图像将为空

标签: java swing nullpointerexception


【解决方案1】:

您的paint() 方法中有一个NPE (NullPointerException)。这意味着您使用了一个未初始化的变量(它只是为空)。因为你的代码不完整,我们不知道第 50 行在哪里,所以我不能告诉你问题到底出在哪里。

另一个注意事项:您从 Thread 内部调用 JPanel 的 repaint 方法,这是不好的做法。 Swing 不是线程安全的。您需要改用SwingUtilities.invokeAndWait(runnable)SwingUtilities.invokeLater(runnable)

【讨论】:

  • "这意味着你使用了一个未初始化的变量"不是总是为真。图像可能为空。尝试g.drawImage(null,...) 会导致 NPE
  • 是的 - 你完全正确。但是 AFAIK 异常应该指向另一个堆栈中的这个调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2023-02-21
  • 2019-11-13
  • 2014-08-24
  • 1970-01-01
  • 2012-03-14
  • 2013-06-04
相关资源
最近更新 更多