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();
}
}就没用!

解决方案 »

  1.   

    这个问题,你得了解this的用法了。重新google一下吧。
      

  2.   

    问:
    为什么只有用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;
    即行了。
      

  3.   

    关于this  记住六个字:指向当前对象(我们老师说的)
      

  4.   

    private class Client implements Runnable { 
    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来使用类属性变量,只是这时就显得多次一举了。
      

  5.   

    你的this.server定义的时候 ,先生成一个new Socket()对象实例对象,然后再this.server = server试试 
      

  6.   

    public Client(Socket s) { 
    s = server; 
    try { 
    infromClient = new DataInputStream(s.getInputStream()); 
    connected = true; 
    } catch (IOException e) { 
    e.printStackTrace(); 

    }s是传值过来的,一般不会传个空指针过来。。
    server是你自己定义成空的。。s现在应该是实例,server是空指针。你把一个空指针赋值给一个实例。。那实例就指向空指针了。把构造方法写到最后面就不带表构造方法最后执行,这个不能按从上至下的顺序来。。你在别的类一new Client构造方法就执行,把一个空指针赋值给一个实例