大家能帮我看看这小鱼儿程序么 很是奇怪 run menu后 有时候就会出现异常 但是程序可以运行 有时就不报错 求高手解答
为什么报出了异常程序也能运行呢import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.MediaTracker;
import javax.swing.JFrame;
public class Menu extends JFrame implements Runnable{
private Image sea;
private MediaTracker mt;
private Fish fish; public Menu(){
this.setTitle("鱼");
this.setBounds(200, 100, 500, 500);
sea=Toolkit.getDefaultToolkit().createImage("sea.gif");
mt=new MediaTracker(this);
mt.addImage(sea, 1);
try {
mt.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
fish=new Fish();
}

public static void main(String[] args) {
Menu menu=new Menu();
new Thread(menu).start();
}
public void paint(Graphics g){
g.drawImage(sea,0,0,null);
fish.move(g);
}
public void run() {
while(true){

this.repaint();
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.MediaTracker;import javax.swing.JFrame;
public class Fish {
public int x,y;
public int xSpeed,ySpeed;
public Image fish1,fish2;
private MediaTracker mt;
private int k=0;
public Fish(){
fish1=Toolkit.getDefaultToolkit().createImage("fish1.gif");
fish2=Toolkit.getDefaultToolkit().createImage("fish2.gif");
mt=new MediaTracker(new JFrame());
mt.addImage(fish2, 1);
mt.addImage(fish1, 1);
try {
mt.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.x=(int)(Math.random()*100)+1;
this.y=(int)(Math.random()*100)+25;
this.xSpeed=(int)(Math.random()*10)+1;
this.ySpeed=(int)(Math.random()*10)+1;
}
public void move(Graphics g){
if(x<=0||x>=470){
xSpeed=-xSpeed;
k++;
}
if(k%2==0){
this.draw(g,fish2);
}else if(k%2==1){
this.draw(g, fish1);
}else{
this.draw(g, fish2);
}
if(y<=25||y>=480){
ySpeed=-ySpeed;
}
x+=xSpeed;
y+=ySpeed;
}
public void draw(Graphics g,Image fish){
g.drawImage(fish,x,y,null);
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【answerwyi】截止到2008-07-12 14:02:08的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    this.setVisible(true);
    fish=new Fish();这两句颠倒一下:fish = new Fish();
    this.setVisible(true);
      

  3.   


    this.setVisible(true);这句之后 JFrame 内的绘图线程就启动了它可能会马上抢到运行机会而开始绘图操作(JFrame 自己不断调用自己的 paint 方法),而此时 fish 还为 null,所以一执行到 fish.move(g); 这句就会抛 NullPointerException 异常,紧接着 AWT 线程就挂了。