2012-06-06 2 views
3

지금 이틀 동안이 문제에 대한 해답을 찾고 있었지만 해결하지 못했습니다. 대부분 내가 처음부터 내 오류를 일으키는 것이 무엇인지 이해하지 못하거나 문제를 해결하는 방법을 알지 못하기 때문입니다.스레드에서의 예외, java.lang.NullPointerException

나는 "애니메이션"을 만들려고 노력했다. 그 중 하나의 레이어가 화면의 오른쪽에 원을 만들어 시간이 지남에 따라 왼쪽으로 보낸다. 문제는 서클을 생성 할 때마다 발생하며 표시되지 않으며 오류가 발생합니다. 여기

Exception in thread "Thread-4" java.lang.NullPointerException 
at Ball.draw(Ball.java:39) 
at Ball.run(Ball.java:23) 

는 오류의 원인이되는 클래스입니다 :

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.util.Random; 
import javax.swing.JPanel; 


public class Ball extends Thread{ 
    JPanel drawingPanel; 
    private int x=400,y=200; 
    private int dx=-2,dy=0; 
    private static final int XSIZE=10,YSIZE=10; 
    Random rdm = new Random(); 
    int y_rdm = rdm.nextInt(440)+30; 

    public Ball(JPanel jp){ 
     drawingPanel=jp; 
     dx-=1; 

    } 
    public void run(){ 
     draw(); 
     for (int i=0;i<1000;i++){ 
      try{ 
       Thread.sleep(10); 
      } 
      catch(InterruptedException e){} 
      move(); 
     } 
    } 
    private void move(){ 
     erase(); 
     changePos(); 
     draw(); 
    } 
    private void draw(){ 
     Graphics g = drawingPanel.getGraphics(); 
     g.setColor(Color.WHITE); 
     g.fillOval(x,y_rdm,XSIZE,YSIZE); 
     g.dispose(); 
    } 
    private void erase(){ 
     Graphics g=drawingPanel.getGraphics(); 
     g.setColor(drawingPanel.getBackground()); 
     g.fillOval(x,y_rdm,XSIZE,YSIZE); 
     g.dispose(); 
    } 

    private void changePos(){ 
     x+=dx;y_rdm+=dy; 
    } 



} 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 


public class BallPanel extends JPanel implements ActionListener{ 

    JPanel drawingPanel = new JPanel(); 
    public BallPanel(){ 

     int delay = 300; 
     ActionListener taskPerformer = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       Ball b= new Ball(drawingPanel); 
       b.start(); 
      } 
     }; 

     new Timer(delay, taskPerformer).start(); 

    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 

    } 

} 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.io.InputStream; 
import java.net.URL; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 
import javazoom.jl.player.Player; 


public class Window extends JFrame{ 

     private JLayeredPane layerpane; 
     private JPanel up, down; 

    public Window(){ 
      layerpane = new JLayeredPane(); 

      down = new JPanel(); 
      down.setBounds(0, 0, 450, 450); 
      down.setBackground(new Color(0, 51, 102)); 
      layerpane.add(down, new Integer(1)); 

      BallPanel bp = new BallPanel(); 
      layerpane.add(bp, new Integer(2)); 
      bp.setBounds(0, 0, 450, 450); 
      bp.setOpaque(!bp.isOpaque()); 

      Animation2 ani2 = new Ani2(); 
      ani2.setBounds(0, 0, 400, 450); 
      layerpane.add(ani2, new Integer(3)); 

      ani2.setOpaque(!ani2.isOpaque()); 

     getContentPane().add(layerpane, BorderLayout.CENTER); 

    } 

     public static void main(String args[]){ 

     JFrame f = new Window(); 

     f.setVisible(true); 
     f.setSize(450,450); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     try{ 
      URL url = new URL("file:///C://song.mp3"); 
      InputStream in = url.openStream(); 
      Player pl = new Player(in); 
      pl.play(); 
      }   

      catch(Exception e){ 
       e.printStackTrace(); 
      } 


     } 

    } 

난 내 다른 클래스를 포함해야하는 경우, 제발 말해 그들은 단지 약간 무관 한 것처럼 보입니다.

+0

있습니다. 바보 같은 질문. – Hassan

+2

코드에서 Ball.java:39의 라인은 무엇입니까? –

+5

'drawingPanel.getGraphics()'가 null을 반환한다는 오류가 있습니다. 이 [여기] (http://www.coderanch.com/t/407987/java/java/getGraphics-returns-null) 및 [StackOverflow post] (http://stackoverflow.com/questions/2275259/)에 대해 읽어보십시오. 언제든지 getgraphics-return-a-valid-graphics-instance) –

답변

5

JComponent의 메서드는 Component과 연결된 Graphics 개체를 반환합니다. 그러나 Graphics 객체가 연결되어 있지 않으면 코드에서 null이 반환됩니다.

Component은 하나와 관련된, 또는 컨테이너에 추가했을 경우에만 Graphics 객체와 연관된 상위 수준 컨테이너 (JFrame, JDialogJApplet) 인 경우.

귀하의 문제는 귀하의 JPanel이 최상위 컨테이너 안에 포함되어 있지 않아 해당 Graphics 개체가 null이라는 것입니다.

는 이후 선호하는 문제를 수정하거나 당신이 그것에 getGraphics()를 호출하기 전에 당신이 최상위 컨테이너에 JPanel를 추가했는지 확인하거나 대신 JPanel을 확장하고 그리기 (두 번째 옵션을 할 수는 paintComponent(Graphics g) 방법을 재정의하려면 paintComponent 부모 컨테이너를 다시 그릴 때마다 (예 : 크기가 조정되거나 다른 창에 의해 차단되고 차단 해제 된 경우 ...)) 메소드가 자동으로 호출됩니다.

(그건 그렇고, JPanel를 확장하여 BallPanel 클래스의 새 JPanel을 정의하고 Ball의 생성자에 전달. drawingPanel 어떤 컨테이너에 추가되지 않습니다 때문에 당신은 생성자에 this을 통과해야한다 하지만 BallPanel 인스턴스 자체는 JPanel 필드를 JPanel 클래스 내에 정의하고 해당 필드가 클래스 자체에서 수행해야하는 작업을 수행하도록하는 것은 실제로 이해가되지 않습니다.

관련 문제