一天解决不了的空指针异常(求解java)程序如下
客户端运行结果:
Exception in thread "main" java.lang.NullPointerException
at cn.com.client1.Client.closeSocket(Client.java:50)
at cn.com.client1.Client.doLogin(Client.java:76)
at cn.com.client1.ClientScream.createLoginView(ClientScream.java:37)
at cn.com.client1.ClientScream.main(ClientScream.java:24)
服务器端运行结果:
Exception in thread "Thread-0" java.lang.NullPointerException
at cn.com.serverSocket1.Server_Socket.run(Server_Socket.java:86)
[code=Java][/code]截图如下
客户端 界面代码:
package cn.com.client1;
import java.util.Scanner;
import cn.com.entity1.Cashier;
import cn.com.entity1.StoreMgr;
import cn.com.util1.Goods;
import cn.com.util1.SysConstants;
/*
* 客户端界面类
*/
public class ClientScream {
//控制台输入对象
private static Scanner scanner =new Scanner(System.in);
//客户端业务对象
private static Client client=new Client();
public static void main(String[] args) {
System.out.println("*********欢迎使用青鸟超市管理系统**********");
System.out.println("1.登录\n2.退出系统");
System.out.println("************请选择数字1/2*************");
int num=scanner.nextInt();
if (num==1) {
//调用登录视图
createLoginView();
}
System.out.println("系统终止运行");
}
public static void createLoginView(){
while (true) {
System.out.println("用户名称:");
String username=scanner.next();
System.out.println("用户密码:");
String password=scanner.next();
//调用登录服务业务 且向服务器端发送请求
Goods goods=client.doLogin(username,password);
System.out.println("客户端向服务器端发送请求成功!");
//服务器回复了请求
if (SysConstants.SYS_SUCCESS.equals(goods.getFlag())) {
//正确返回数据
System.out.println("服务器端回复客户端,响应成功!\n客户端开始操作......");
//调用学员管理视图
// createCommodifyManagerView(goods.getStoremgr());
break;
}else {
//出错,继续登录
System.out.println("用户名或者密码输入错误!登录失败!");
}
}
}
}
服务器端 代码:
package cn.com.serverSocket1;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import cn.com.entity1.StoreMgr;
import cn.com.util1.Goods;
import cn.com.util1.SysConstants;
import cn.com.util1.Tools;
/*
服务器端的线程类
*/
public class Server_Socket extends Thread {
public static void main(String[] args) {
//线程子类的对象的启动
new Server_Socket().start();
}
//重写run方法
public void run() {
System.out.println("服务器启动!");
ServerSocket serverSocket=null;
ObjectOutputStream objectOutputStream=null;
ObjectInputStream objectInputStream = null;
Socket socket =null;
//创建Server_Socket对象,绑定一个端口
try {
serverSocket=new ServerSocket(Integer.parseInt(Tools.getValue(SysConstants.SYS_LISTENERPORT)));
//对socket对象,接受accept();
while(true){
socket=serverSocket.accept();
//对建立输入输出流 且实例化(对对象进行 序列化和反序列化)
objectOutputStream=new ObjectOutputStream(socket.getOutputStream());
objectInputStream =new ObjectInputStream(socket.getInputStream());//由服务器端开始
//在协议上进行读 取
//读 接受请求
System.out.println("服务器端接受客户端请求成功!");
Goods goods=(Goods)objectInputStream.readObject();
//取 回复请求
System.out.println("服务器端开始处理并回复请求!");
//创建服务器业务对象,区分服务业务
ServerService serverService=new ServerService();
if(SysConstants.SYS_LOGIN.equals(goods.getFlag())){
//回复登录请求
String username=goods.getStoremgr().getUsername();
String password=goods.getStoremgr().getPassword();
StoreMgr storemgr=serverService.doLogin(username,password);
//判断调用服务器端服务业务方法是否正确
if (storemgr==null) {
//登录失败
goods.setFlag(SysConstants.SYS_ERROR);
}else {
//登录成功
System.out.println("服务器端正在给客户端传送数据!");
goods.setStoremgr(storemgr);//返回给setStoremgr
goods.setFlag(SysConstants.SYS_SUCCESS);
}
}else {
goods.setFlag(SysConstants.SYS_SUCCESS);
}
objectOutputStream.writeObject(goods);
objectOutputStream.flush();
socket.shutdownOutput();
}
//关闭流以及socket对象
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
objectInputStream.close();
objectOutputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("服务器终止");
}
}
[解决办法]
我没看到你的Client类代码啊,
你定位到具体哪一行代码,
空指针异常还是比较好解决的。。。
[解决办法]
at cn.com.client1.Client.doLogin里的
at cn.com.client1.Client.closeSocket方法的问题
Scoket关闭的时候,是不是没有做判断?
我的异常网推荐解决方案:程序员的一天,http://www.myexception.cn/other/1391144.html