会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132359个问题
JAVA 全系列/第一阶段:JAVA 快速入门/面向对象详解和JVM底层内存分析 38509楼

package com.sxt.planegame;

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;

public class PlaneGame extends Frame{
	
	Image bg = GameUtil.getImage("images/bg.jpg");
	Image planeImg = GameUtil.getImage("images/plane.png");
	
	Plane plane = new Plane(planeImg, 250, 150);
	Shell[] shells = new Shell[30];
	
	
	//创建窗口方法
	public void launchFrame() {
		this.setTitle("尚学堂学员_刘江");
		this.setVisible(true);
		this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);
		this.setLocation(300, 300);
		
		//窗口关闭,程序关闭
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		
		//启动重画多线程
		new paintThread().start();
		
		//添加键盘监听
		addKeyListener(new keyControl());
		
		//在窗口加载时初始化炮弹个数
		for (int i = 0; i < shells.length; i++) {
			shells[i] = new Shell();
		}
	}
	
	//paint是窗口的一个主要方法,用于绘制窗口
	 @Override
	public void paint(Graphics g) {
		g.drawImage(bg, 0, 0, null);
		plane.drawSelf(g);
		
		//画出20个炮弹
		for(int i = 0; i < shells.length; i++) {
			shells[i].drawSelf(g);  //画出每个炮弹
			boolean peng = shells[i].getRectangle().intersects(plane.getRectangle());
			if(peng) {
				System.out.println("相撞了");
				plane.live = false;
			}
		}
	}
	 
	 //使用内部类+多线程实现动画效果
	 class paintThread extends Thread{
		 @Override
		public void run() {
			while(true) {
				repaint();
				
				try {
					Thread.sleep(40);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	 }
	 
	 //用键盘控制飞机
	 class keyControl extends KeyAdapter {
		 //按下键盘
		@Override
		public void keyPressed(KeyEvent e) {
			plane.addKeyMonitor(e);
		}
		//松掉键盘
		@Override
		public void keyReleased(KeyEvent e) {
			plane.minusKeyMonitor(e);
		}
	 }
	 
	 
	
	//主方法
	public static void main(String[] args) {
		PlaneGame planeGame = new PlaneGame();
		planeGame.launchFrame();
	}
	
	//双缓冲解决闪烁问题,不使用JFrame原始处理
	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);
	}
}
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at com.sxt.planegame.PlaneGame.paint(PlaneGame.java:57)
	at sun.awt.RepaintArea.paintComponent(Unknown Source)
	at sun.awt.RepaintArea.paint(Unknown Source)
	at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

老师,可以帮我看看这个问题吗?在paint()中重画20个炮弹的时候不会提示错误,运行时总是提示下面错误,导致无法实现碰撞问题。

JAVA 全系列/第一阶段:JAVA 快速入门/飞机大战小项目训练 38510楼

问题:request类空指针异常

image.png

代码:

package cn.ww.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 对服务器请求的类
 * */
public class Request {
	private final static String CRLF = "\r\n";
	private final static String BLANK =" ";
	private InputStream is;//输入流
	private String requestInfo;//存放请求信息
	private String method;//请求的方式
	private String url;//请求的url
	private Map<String,List<String>> parameterValues;//存放参数
	
	public Request() {
		method="";
		url="";
		requestInfo="";
		Map<String,List<String>> parameterValues =new HashMap<String,List<String>>();
	}

	public Request(InputStream is) throws IOException {
		this();
		this.is=is;
		byte [] b =new byte[20480];
		int len = is.read(b);
		requestInfo =new String(b,0,len);
		
		this.parseRequestInfo();
	}
	//分析请求信息,提取方法及url
	private void parseRequestInfo() {
		//第一行,从头到第一个换行位置
		String firstLine=requestInfo.substring(0, requestInfo.indexOf(CRLF)).trim();
		//获取请求方式,第一个 / 之前
		this.method=firstLine.substring(0, firstLine.indexOf("/")).trim();
		//获取url,/ 到HTTP/ 之间
		String urlString= firstLine.substring(firstLine.indexOf("/"),firstLine.indexOf("HTTP/")).trim();
		String paraString="";//存储请求参数
		//判断get或post方法获取url
		if("get".equalsIgnoreCase(this.method)){  
			if (urlString.contains("?")) {
				String [] urlArray=urlString.split("\\?");
				this.url=urlArray[0];
				paraString=urlArray[1];
			}else{
				this.url=urlString;
			}
		}else{//post
			this.url=urlString;
			paraString=requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();
		}
		if (paraString.equals("")) {
			return;
		}
		this.parseParam(paraString);
	}
	//将参数分解出来
	private void parseParam(String paraString) {
		String [] token=paraString.split("&");
		for(int i=0;i<token.length;i++){
			String keyValues=token[i];
			String [] kv=keyValues.split("=");
				if(kv.length==1) {
					kv=Arrays.copyOf(kv, 2);
					kv[1]=null;
				}
				//将分解出的参数存储到Map中
				String key=kv[0].trim();
				String value=kv[1]==null?null:decode(kv[1].trim(), "utf-8");
				if(!parameterValues.containsKey(key)) {
					parameterValues.put(key, new ArrayList<String>());
				}
				List<String> values=parameterValues.get(key);
				values.add(value);	
		}

	}
	//根据表单元素的name获取多个值
	private String [] getParamterValues(String name){
		//根据key获取value
		List<String> values=parameterValues.get(name);
		if (values==null) {
			return null;
		}else{
			return values.toArray(new String [0] );
		}
		
	}
	public String getParamter(String name){
		//调用本类中根据name获取多个值的方法
		String [] values=this.getParamterValues(name);
		if (values==null) {
			return null;
		}else{
			return values[0];
		}
	}
		
		//处理中文,进行解码
	private String decode(String value,String code){
		try {
			return URLDecoder.decode(value, code);
		} catch (UnsupportedEncodingException e) {
			
			e.printStackTrace();
		}
		return null;
	}

	public String getUrl() {
		return url;
	}

	//测试
	public static void main(String[] args) {
		Request req=new Request();
		//调用分解参数的方法
		req.parseParam("username=us");
		System.out.println(req.parameterValues);
		
		//调用获取单个值的方法
		System.out.println(req.getParamter("pwd"));
	}


	

}

请老师帮忙看看,为什么 parameterValues传不进去值?

JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 38511楼
JAVA 全系列/第一阶段:JAVA 快速入门/飞机大战小项目训练 38515楼
JAVA 全系列/第一阶段:JAVA 快速入门/控制语句、方法、递归算法 38518楼
Python 全系列/第七阶段:网页编程基础/html5 38520楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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