空指針異常問題
//服務器端
package?chatroom;
import?java.io.BufferedReader;
import?java.io.IOException;
import?java.io.InputStreamReader;
import?java.io.PrintStream;
import?java.net.ServerSocket;
import?java.net.Socket;
import?java.util.HashMap;
public?class?ChatServer?{
private?static?HashMap<String,?Socket>?users?=?new?HashMap<String,?Socket>();
public?static?void?addClient(String?addr,?Socket?socket)?{
users.put(addr,?socket);
}
public?static?Socket?getClient(String?addr)?{
return?users.get(addr);
}
public?static?HashMap<String,?Socket>?getUsers()?{
return?users;
}
public?static?void?main(String[]?args)?{
new?ChatServer().startServer();
}
public?void?startServer()?{
try?{
ServerSocket?s?=?new?ServerSocket(9000);
System.out.println("服務器已經開啟");
while?(true)?{
Socket?socket?=?s.accept();
String?addr?=?socket.getInetAddress().getHostAddress();
System.out.println("接收到"?+?addr?+?"的訪問");
ChatServer.addClient(addr,?socket);
new?Service(socket);
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
}
}
class?Service?extends?Thread?{
private?Socket?socket;
private?BufferedReader?br;
private?String?addr;
public?Service(Socket?socket)?{
super();
this.socket?=?socket;
try?{
BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(
socket.getInputStream()));
}?catch?(IOException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
this.addr?=?socket.getInetAddress().getHostAddress();
this.start();
}
public?boolean?check()?throws?IOException?{
String?str?=?br.readLine();
if?(str?==?null?||?str.equals(""))?{
br.readLine();
}
String?ip?=?str.split("/")[0];
Socket?clientSocket?=?ChatServer.getClient(ip);
if?(clientSocket?==?null)?{
return?true;
}?else?{
return?false;
}
}
@Override
public?void?run()?{
try?{
while?(true)?{
String?str?=?br.readLine();
if?(str?==?null?||?"".equals(str))continue;
if?("exit".equals(str))?{
System.out.println("有程序退出");
}
int?index?=?str.indexOf("/");
if?(index?==?-1)?{//?群聊--->遍歷所有的socket進行寫操作
for?(String?ip?:?ChatServer.getUsers().keySet())?{
Socket?clientSocket?=?ChatServer.getUsers().get(ip);
PrintStream?toAll?=?new?PrintStream(
clientSocket.getOutputStream(),?true);
toAll.println(str);
}
}?else?if?(this.check())?{
PrintStream?ps?=?new?PrintStream(socket.getOutputStream());
ps.println("您要發送的客戶端不存在");
}?else?{//?私聊
String?ip?=?str.split("/")[0];
String?content?=?str.split("/")[1];
String?text?=?this.addr?+?content;//?最后要發送的信息,開頭得是發送者
Socket?clientSocket?=?ChatServer.getClient(ip);
if?(clientSocket?==?null)?{
PrintStream?returns?=?new?PrintStream(
socket.getOutputStream());
returns.println("您要發送的客戶端不存在");
}
PrintStream?clientToClient?=?new?PrintStream(
clientSocket.getOutputStream(),?true);
clientToClient.println(text);
}
}
}?catch?(Exception?e)?{
e.printStackTrace();
}
}
}//客戶端
package?chatroom;
import?java.io.BufferedReader;
import?java.io.IOException;
import?java.io.InputStreamReader;
import?java.io.PrintWriter;
import?java.net.Socket;
public?class?ChatClient?{
public?static?void?main(String[]?args)?{
new?ChatClient().starCliant();
}
public?void?starCliant(){
try?{
Socket?socket?=?new?Socket("127.0.0.1",9000);
new?AcceptData(socket);
BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(System.in));
PrintWriter?out?=?new?PrintWriter(socket.getOutputStream(),true);?
while(true){
String?str?=?br.readLine();
if("exit".equals("str"))break;
out.println(str);
}socket.close();
}?catch?(Exception?e)?{
e.printStackTrace();
}
}
}
class?AcceptData?extends?Thread?{
private?Socket?socket;
private?BufferedReader?br;
public?AcceptData(Socket?socket)?{
this.socket?=?socket;
try?{
BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(
socket.getInputStream()));
}?catch?(IOException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
this.start();
}
@Override
public?void?run()?{
try?{
while?(true)?{
String?str?=?br.readLine();
if(str==null||"".equals(str))continue;
if("exit".equals(str)){
System.out.println("有客戶端退出");
}
int?index?=?str.indexOf("/");
if(index==-1){//說明是群聊
System.out.println("群聊的內容為"+str);
}else{//私聊的內容
String[]?ss?=?str.split("/");
System.out.println(ss[0]+"對你說"+ss[1]);
}
}
}?catch?(IOException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
}
}一個用IO做的簡易聊天室,為什么做了判斷還是報空指針異常?


2017-02-14
----------------------------------------------------------------------------------------
客戶端同樣方式修改。。。