2014-10-08 3 views
0

저는 처음 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를 이용해야하며, 내가 그것을 해결하기 위해가는 것을 알고,하지만 난 돈 ' T는이 문제를 완전히 해결할 것이라고 생각합니다. (모든 이미지로드를 주석 처리해도 문제가 해결되지 않습니다.)

어디서나 해결책을 찾을 수 없으므로이를 해결하는 방법을 아는 것이 좋을 것입니다.

EDIT : 몇 가지 시도를했는데 명령 프롬프트가 결국이 오류의 인쇄를 중지하고 g.drawImage (image, x, y, null) 메서드 만 사용하면 응용 프로그램이 시작된다는 것을 알았지 만 반복합니다 무한히 g.drawImage (image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null) 메소드를 사용할 때.

+0

파일 50에서 Spike.java를 확인하십시오. Null 포인터 예외가 있습니다. – Anon

+0

** (1) ** - ['dimension == "normaal"'] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java). ** (2) ** "Images"폴더가 "working directory"에 있습니까? 그렇지 않으면 이미지가 null이됩니다 –

답변

0

당신의 paint() - Method에 NPE (NullPointerException)가 있습니다. 이는 초기화되지 않은 변수를 사용한다는 것을 의미합니다 (단지 null 임). 코드가 완전하지 않기 때문에 50 행이 어디에 있는지 알 수 없으므로 정확히 어디에 문제가 있는지 알 수 없습니다.

또 다른 참고 사항 : JPanel의 repaint 메서드를 스레드 내부에서 호출하는 것은 나쁜 습관입니다. 스윙은 thread-safe가 아닙니다. 대신 SwingUtilities.invokeAndWait(runnable) 또는 SwingUtilities.invokeLater(runnable)을 사용해야합니다.

+1

_ "초기화되지 않은 변수를 사용한다는 의미입니다."_ Not _always_ true. 이미지는 null 일 수 있습니다. 'g.drawImage (null, ...) '을 시도하면 NPE가 발생합니다 –

+0

예 - 완벽합니다. 그러나 AFAIK Exception은 다른 스택에서이 호출을 가리켜 야합니다. –

관련 문제