2014-10-10 54 views
0

我在java中创建了一个程序,该程序应该创建10个随机出现和移动的balle,这些球 - 线程应该并行运行,不幸的是程序不能编译。有谁知道为什么? 我收到以下错误每个主题:Java:平行移动球

package movement; 

import java.applet.Applet; 
import java.awt.*; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.Random; 



public class Ball { 
    int x; 
    int y; 
    int radius = 10; 
    public Graphics g; 
    int dx, dy, n = 0; 

    Ball(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public void move() { 
     Random randomX = new Random(); 
     Random randomY = new Random(); 
     Random randomN = new Random(); 
     paint(); 

     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      //TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     x = x + dx; 
     y = y + dy; 
     dx = (int) (Math.pow(-1, n) * randomX.nextInt(5)); 
     dy = (int) (Math.pow(-1, n) * randomY.nextInt(5)); 
     n = randomN.nextInt(10) + 1; 
    } 

    public void paint() { 
     g.setColor(Color.black); 
     g.fillOval(x + 100, y + 100, radius, radius); 
    } 

} 

package movement; 


class BallMovement implements Runnable { 
    private final Ball ball; 

    BallMovement(Ball ball) { 
     this.ball = ball; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      ball.move(); 
      try { 
       Thread.sleep(20); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

package movement; 

     import java.applet.Applet; 
     import java.awt.Color; 
     import java.awt.Graphics; 
     import java.util.Iterator; 
     import java.util.List; 
     import java.util.ArrayList; 
     import java.util.Random; 

public class StartingPoint extends Applet { 

    public int startX, startY; 
    private static final int nbBalles = 10; 
    private static final long serialVersionUID = 1L; 
    ArrayList<Ball> BallList = new ArrayList<Ball>(); 

    @Override 
    public void init() { 
     for (int i = 0; i < nbBalles; i++) { 
      Random randX = new Random(); 
      Random randY = new Random(); 
      startX = randX.nextInt(500) + 1; 
      startY = randY.nextInt(500) + 1; 
      BallList.add(new Ball(startX, startY)); 
     } 
    } 

    @Override 
    public void start() { 
     Iterator<Ball> it = BallList.iterator(); 
     while (it.hasNext()) { 
      Ball ball = it.next(); 
      Thread thread = new Thread(new BallMovement(ball)); 
      thread.start(); 
     } 
    } 

    @Override 
    public void stop() { 
     // TODO Auto-generated method stub 
    } 
} 

例外:

Exception in thread "Thread-5" 
java.lang.NullPointerException at movement.Ball.paint(Ball.java:40) 
at movement.Ball.move(Ball.java:23) 
at movement.BallMovement.run(BallMovement.java:13) 
at java.lang.Thread.run(Thread.java:695) 
+4

编译错误告诉你什么? – Reimeus 2014-10-10 11:23:37

+0

对不起,我忘了添加错误,Exception in thread“Thread-5”java.lang.NullPointerException \t at movement.Ball.paint(Ball.java:40) \t at movement.Ball.move(Ball.java :23) \t它在编译,但你在运行时得到一个异常。在移动时.BallMovement.run(BallMovement.java:13) \t在java.lang.Thread.run(Thread.java:695) – 2014-10-10 11:26:17

+0

编译。 – Magnilex 2014-10-10 11:28:14

回答

1

你应该得到Graphics对象来自Appletvoid paint(Graphics g)方法。

public class StartingPoint extends Applet { 

    public int startX, startY; 
    private static final int nbBalles = 10; 
    private static final long serialVersionUID = 1L; 
    ArrayList<Ball> BallList = new ArrayList<Ball>(); 
    ... 

    @Override 
    public void paint(Graphics g) 
    { 
     for(Ball ball : BallList) 
     { 
      ball.paint(g); 
     } 
    } 
} 

和在球,paint()方法改变为paint(Graphics g)

并且不要从move()调用paint(),并且在Ball类中没有Graphics变量。

+1

该程序现在完美工作,非常感谢! – 2014-10-10 14:03:46

0

我认为这个问题是这个领域:

public Graphics g; 

当在这种方法中使用。

public void paint() { 
    g.setColor(Color.black); 
    g.fillOval(x + 100, y + 100, radius, radius); 
} 

您所引用的g字段未初始化。

你可以通过改变你的球构造函数

Ball(int x, int y, Graphics g) { 
    this.x = x; 
    this.y = y; 
    this.g = g; 
} 

初始化你的球对象时解决它,然后你通过图形从applet的对象:

BallList.add(new Ball(startX, startY, getGraphics()));