为了账号安全,请及时绑定邮箱和手机立即绑定

新手求教!使用序列化做的时候,我的服务器端抛出了空指针异常,该怎么修改呢?

服务器端

package com.imooc;


import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.io.Writer;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;


public class ObjectServer {


/**

* @param args

* @throws IOException 

* @throws UnknownHostException 

*/

public static void main(String[] args) throws IOException  {

// Socket socket=new Socket("localhost", 8888);

// System.out.println("InetAddress:"+socket.getInetAddress());

ServerSocket serverSocket=new ServerSocket(8888);

Socket socket = null;

InputStream is=null;

OutputStream os = null;

ObjectInputStream ois=null;

BufferedReader br = null;

PrintWriter pw = null;

try {

is=socket.getInputStream();      //【】【】这里就是出错的地方,第34行

ois=new ObjectInputStream(is);

String info;

while((info=br.readLine())!=null){

System.out.println("我是服务器,客户端说:"+info);

}

socket.shutdownInput();

os=socket.getOutputStream();

pw=new PrintWriter(os);

pw.write("欢迎您!");

pw.flush();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(is!=null)

is.close();

if(os!=null)

os.close();

if(ois!=null)

ois.close();

if(br!=null)

br.close();

if(pw!=null)

pw.close();

if(socket!=null)

socket.close();

}


}


}


客户端

package com.imooc;


public class User {


private String userName;

private String userKey;

public User(String userName,String userKey){

this.userName=userName;

this.userKey=userKey;

}

}

package com.imooc;


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;



public class ObjectClient {


/**

* @param args

*/


public static void main(String[] args) {

try {

Socket socket=new Socket("localhost", 8888);

System.out.println("InetAddress:"+socket.getInetAddress());

OutputStream os=socket.getOutputStream();

//使用ObjectOutputStream对象序列化流,传递对象

ObjectOutputStream oos=new ObjectOutputStream(os);

User user=new User("admin", "123");

oos.writeObject(user);//序列化

socket.shutdownOutput();

BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));

String info=br.readLine();

while(info!=null){

System.out.println("我是客户端,服务器说:"+info);

// info=br.readLine();

}

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


运行服务器端ObjectServer类是抛出的异常如图片所示http://img1.sycdn.imooc.com//579cb08a00015d2507230544.jpg

正在回答

2 回答

你的代码写错了,服务器端socket是由serverSocket.accept();来初始化,这样获取客户端传来的数据,除此之外你的User类还需要实现序列化接口,implements Serializable,最好把set/get方法补上,JavaBean的习惯养好,另外如果报端口号占用的异常,你就把端口号改一下,因为你按老师步骤实践可能8888端口之前已经用过了。

//1、创建一个服务器端Socket,即serverSocket,指定绑定的端口
		ServerSocket serverSocket=new ServerSocket(8801);
		//2、调用accept方法开始监听,等待客户端的连接
		System.out.println("***服务器即将启动,等待客户端的连接****");
		Socket socket=serverSocket.accept();
		//3、获取输入流,并读取客户端信息
		InputStream is=socket.getInputStream();//字节输入流
		//反序列化
		ObjectInputStream ois=new ObjectInputStream(is);
		User user=(User)ois.readObject();
		System.out.println("我是服务器,客户端说:"+user.toString());


0 回复 有任何疑惑可以回复我~
#1

陈婉 提问者

非常感谢!
2016-08-01 回复 有任何疑惑可以回复我~

你可以在那行提示空指针的下面在写一个}catch(NullPointerException e ){这样就可以避免了,可以通过添加多个catch语句来规避遇到的多个异常。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

新手求教!使用序列化做的时候,我的服务器端抛出了空指针异常,该怎么修改呢?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信