会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 133324个问题
JAVA 全系列/第一阶段:AI驱动的JAVA编程/面向对象详解和JVM底层内存分析 3676楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/变量、数据类型、运算符 3677楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/飞机大战小项目训练 3678楼

老师,为什么在程序运行后,能够正常运行,但总是出现异常呢?我根据老师的源码检查了多次,没有发现哪里有问题啊?

package cn.sxt.game;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

/**
 * 容器和数组产生多发炮弹
 * @author Administrator
 *
 */
public class MyGameFrame extends Frame{
	
	Image planeImg = GameUtil.getImage("images/plane.png");
	Image bg = GameUtil.getImage("images/bg.jpg");
	//创建飞机的对象,并调用Plane
	Plane plane = new Plane(planeImg,250,250);
	//创建炮弹的对象,并调用Shell
	Shell[] shells = new Shell[50];
	
	
	@Override
	public void paint(Graphics g) {//自动被调用。g变量相当于画笔
		
		g.drawImage(bg, 0, 0, null);
		plane.drawSelf(g);//画飞机
		
		//画50个炮弹
		for(int i = 0;i<shells.length;i++) {
			shells[i].draw(g);
			
			//飞机和炮弹的碰撞检测
			boolean peng = shells[i].getRect().intersects(plane.getRect());
			
			if(peng) {
				plane.live = false;
			}
		}
	}
	
	//定义一个内部类并继承线程
	class PaintThread extends Thread{
		
		@Override
		public void run() {
			while(true) {
				repaint();//重画窗口
			
			
				try {
					Thread.sleep(40);//1秒等于1000毫秒
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			
			}	
		}
	}
	
	//定义键盘监听的内部类,并继承KeyAdapter
	class KeyMonitor extends KeyAdapter{

		@Override
		//按一下键,会获得那些信息
		public void keyPressed(KeyEvent e) {
			plane.addDirection(e);//调用Plane中的按下方法
		}

		@Override
		//释放按键,会获得哪些信息
		public void keyReleased(KeyEvent e) {
			plane.minusDirection(e);
		}
	
	}
	
	
	/**
	 * 初始化窗口
	 */
	public void launchFrame() {
		this.setTitle("2D经典");//窗口名称
		this.setVisible(true);
		this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);//设置窗口大小
		this.setLocation(300, 300);//设置窗口位置
		
		//定义窗口关闭程序
		this.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);//表示直接关闭
			}
		});
		
		new PaintThread().start();//启动重化窗口的线程
		addKeyListener(new KeyMonitor());//给窗口增加键盘的监听	
		
		//初始化50个炮弹
		for(int i = 0;i<shells.length;i++) {
			shells[i] = new Shell();
		}
	
	
	}
	
	public static void main(String[] args) {
		MyGameFrame f = new MyGameFrame();
		f.launchFrame();
	}
	
	private Image offScreenImage = null;
	
	public void update(Graphics g) {
		if(offScreenImage == null)
			offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//窗口的宽度和高度
		
		Graphics gOff = offScreenImage.getGraphics();
		paint(gOff);
		g.drawImage(offScreenImage, 0, 0, null);
	}
}

	

GIF.gif

JAVA 全系列/第一阶段:AI驱动的JAVA编程/飞机大战小项目训练 3679楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/面向对象详解和JVM底层内存分析 3682楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/JAVA入门和背景知识 3683楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/控制语句、方法、递归算法 3684楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/JAVA入门和背景知识 3685楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/面向对象详解和JVM底层内存分析 3687楼

package cn.sxt.game;


import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;


import javax.swing.JFrame;


/**

 * 飞机游戏的主窗口

 * @author 陈洁

 *

 */


public class MyGameFrame extends JFrame {

Image bg=GameUtil.getImage("images/bg.jpg");

Image planeImg=GameUtil.getImage("images/plane.png");

Plane plane=new Plane(planeImg, 250, 250);

Shell[] shells=new Shell[50];

@Override

public void paint(Graphics g) {


g.drawImage(bg,0,0,null);

plane.drawSelf(g);

for(int i=0;i<shells.length;i++){

shells[i].draw(g);

}

}

//帮助我们反复的重画窗口

class PaintThread extends Thread{

public void run(){

while(true){

repaint();

try {

Thread.sleep(40);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

//定义键盘监听的内部类

class KeyMonitor extends KeyAdapter{


@Override

public void keyPressed(KeyEvent e) {

plane.addDirection(e);



}


@Override

public void keyReleased(KeyEvent e) {

plane.minusDirection(e);


}

}

public void launchFrame(){

this.setTitle("尚学堂学员_程序猿作品");

this.setVisible(true);//默认不可见,true 可见

this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);//窗口大小

this.setLocation(300, 200);

this.addWindowListener(new WindowAdapter(){

@Override

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

new PaintThread().start();

addKeyListener(new KeyMonitor());//给窗口增加键盘的监听

//初始化50个炮弹

for(int i=0;i<shells.length;i++){

shells[i]=new Shell();

}

}

public static void main(String[] arge){

MyGameFrame f=new MyGameFrame();

f.launchFrame();

}


}



我运行之后 可以运行,但是下面有提示:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

at cn.sxt.game.MyGameFrame.paint(MyGameFrame.java:30)

at javax.swing.RepaintManager$3.run(RepaintManager.java:819)

at javax.swing.RepaintManager$3.run(RepaintManager.java:796)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)

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:1677)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)

at java.awt.EventQueue.access$200(EventQueue.java:103)

at java.awt.EventQueue$3.run(EventQueue.java:694)

at java.awt.EventQueue$3.run(EventQueue.java:692)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

这个是怎么回事??

JAVA 全系列/第一阶段:AI驱动的JAVA编程/飞机大战小项目训练 3688楼
JAVA 全系列/第一阶段:AI驱动的JAVA编程/飞机大战小项目训练 3689楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637