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();
}
}就没用!
解决方案 »
- 又见csdn!- - !大家帮忙出出主意!谢谢
- 请教个局部变量的问题
- JAVA 编程的问题
- 大家说说用java汉语编程的前景吧!!!!
- java中如何进行自定义线型的绘制?
- 哪位可以介绍一下java的本地方法?
- 怎么才能让Eclipse支持中文?
- java.lang.Object的equals, toString 和 hashCode三个方法和 RemoteObject的这三个方法有什么不同;为什么会有这种不同
- 关于applet先是特大图片文件的问题。帮帮忙,快急死了!!-------在线!!
- 两个问题,搞了三天,看了X+Y个贴。还没搞定,请大虾抽空一看。谢了
- 关于对象与references 之间的关系
- java io类库中的文件读问题
为什么只有用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构造方法就执行,把一个空指针赋值给一个实例