import java.io.*;
import java.net.*;public class ChatServer {
boolean started = false;
ServerSocket ser = null;
public static void main(String[] args) {
new ChatServer().start();
}
public void start() {
try {
ser = new ServerSocket(8888);
started = true;
} catch (IOException e1) {
e1.printStackTrace();
}
try {
while(started) {
Socket server = ser.accept();
Client ct = new Client(server);
new Thread(ct).start();
System.out.println("A clinet connected!");
}
} catch (IOException ioe) {
try {
ser.close();
} catch (IOException e) {
e.printStackTrace();
}
ioe.printStackTrace();
}
}
private class Client implements Runnable {
Socket server;
DataInputStream infromClient = null;
boolean connected = false;
public Client(Socket server) {
this.server = server;
try {
infromClient = new DataInputStream(server.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
while(connected) {
String sfromClient = infromClient.readUTF();
System.out.println(sfromClient);
}
} catch (IOException e) {
System.out.println("Maybe the client closed!");
try {
if(infromClient != null) infromClient.close();
if(server != null) server.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
代码中胡有这个构造方法
public Client(Socket server) {
this.server = server;
try {
infromClient = new DataInputStream(server.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
}为什么只有用this的时候才不会出现空指针错呢!如果改成
public Client(Socket s) {
s = server;
try {
infromClient = new DataInputStream(s.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
}就没用!
import java.net.*;public class ChatServer {
boolean started = false;
ServerSocket ser = null;
public static void main(String[] args) {
new ChatServer().start();
}
public void start() {
try {
ser = new ServerSocket(8888);
started = true;
} catch (IOException e1) {
e1.printStackTrace();
}
try {
while(started) {
Socket server = ser.accept();
Client ct = new Client(server);
new Thread(ct).start();
System.out.println("A clinet connected!");
}
} catch (IOException ioe) {
try {
ser.close();
} catch (IOException e) {
e.printStackTrace();
}
ioe.printStackTrace();
}
}
private class Client implements Runnable {
Socket server;
DataInputStream infromClient = null;
boolean connected = false;
public Client(Socket server) {
this.server = server;
try {
infromClient = new DataInputStream(server.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
while(connected) {
String sfromClient = infromClient.readUTF();
System.out.println(sfromClient);
}
} catch (IOException e) {
System.out.println("Maybe the client closed!");
try {
if(infromClient != null) infromClient.close();
if(server != null) server.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
代码中胡有这个构造方法
public Client(Socket server) {
this.server = server;
try {
infromClient = new DataInputStream(server.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
}为什么只有用this的时候才不会出现空指针错呢!如果改成
public Client(Socket s) {
s = server;
try {
infromClient = new DataInputStream(s.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
}就没用!
为什么只有用this的时候才不会出现空指针错呢! 如果改成
public Client(Socket s) {
s = server;
try {
infromClient = new DataInputStream(s.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
} 就没用!答:
与this没有任何关系!
写代码细心些:
将:s = server;改为:
server=s;
即行了。
Socket server;
DataInputStream infromClient = null;
boolean connected = false; public Client(Socket server) {
this.server = server;
---------------------------------------
上面红色部分说明你已经声明了一个Socket对象,this.server指的就是红色的这个server,之所以加this就是为了与public Client(Socket server)中的server区别,如果你把此方法写成
public Client(Socket s)
{ s = server;
.....
}
此时方法体中的server指的就是红色的server,而这个对象只是声明而并没有赋值分配空间,所以就会报空指针错误。
this.属性名这种写法往往就是针对类中出现两个同名的变量,一个是类属性变量一个是方法中的局部变量,只有给类属性变量加一个this才能让编译器分清这两个同名变量,就算不出现同名变量,同样可以用this来使用类属性变量,只是这时就显得多次一举了。
s = server;
try {
infromClient = new DataInputStream(s.getInputStream());
connected = true;
} catch (IOException e) {
e.printStackTrace();
}
}s是传值过来的,一般不会传个空指针过来。。
server是你自己定义成空的。。s现在应该是实例,server是空指针。你把一个空指针赋值给一个实例。。那实例就指向空指针了。把构造方法写到最后面就不带表构造方法最后执行,这个不能按从上至下的顺序来。。你在别的类一new Client构造方法就执行,把一个空指针赋值给一个实例