为什么这里会抛出一个异常?(50分)

  • 主题发起人 主题发起人 Hank
  • 开始时间 开始时间
H

Hank

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么这里会抛出一个异常?
程序:
while(isRunning){
...
clientSocket=listenSocket.accept();
<<-----就是这里
..
}
异常:java.lang.NullPointerException
其中listenSocket是一个ServerSocket对象,clientSocket初始化为null
 
listenSocket有没有用new构造?
 
这是listenSocket的构造程序:
try{
listenSocket=new ServerSocket(SERVER_PORT, MAX_CLIENTS);
}catch(IOException e){
System.err.println("Unable to listen on the port "+SERVER_PORT+" : "+e);
System.exit(1);
}
这一步已经通过了。
怎么会抛出这个异常呢? listenSocket不可能是null, 假设accept()出错,会出现这种情况么?
 
不会,只会抛出IOException和SecurityException。
 
这是相关的源程序:
public static void main(String args[]) {
myServer server=new myServer();
server.serverGo();
}

public void myServer() {
try{
listenSocket=new ServerSocket(SERVER_PORT, MAX_CLIENTS);
}catch(IOException e){
System.err.println("Unable to listen on the port "+SERVER_PORT+" : "+e);
System.exit(1);
}
}
}
//前面好像都没问题了,异常出现在下面
public void serverGo() {
Socket clientSocket=null;
try{
while(isRunning) {
<font color=red>clientSocket=listenSocket.accept();
<<-------问题所在</font>
myHandler newHandler=new myHandler(clientSocket, stockInfo, stockInfoTime);
Thread newHandlerThread=new Thread(newHandler);
newHandlerThread.start();
}
listenSocket.close();
}catch(IOException e){
System.err.println("Failed I/O : "+e);
}
}
 
你把listenSocket声明成一个全局变量,试一下
 
还是一样的。
我是新手,大虾帮帮忙,是不是还有别的原因呢?
 
??让我想想
这样行吗:
private ServersSocket listenSocket;
public static void main(String args[]) {
myServer server=new myServer();
server.serverGo();
}

public void myServer() {

}
public void serverGo() {
listenSocket=new ServerSocket(SERVER_PORT, MAX_CLIENTS);
Socket clientSocket=null;
try{
while(isRunning) {
clientSocket=listenSocket.accept();
myHandler newHandler=new myHandler(clientSocket, stockInfo, stockInfoTime);
Thread newHandlerThread=new Thread(newHandler);
newHandlerThread.start();
}
listenSocket.close();
}catch(IOException e){
System.err.println("Failed I/O : "+e);
}
}
 
Yeah, 这样就没错了!
但是为什么呢? 为什么这样就行了? 把listenSocket的创建放在myServer()种就不行么?
To eguy:
谢谢你,分马上就给。但是我想知道我为什么错了!
 
如果那位大虾知道错误的原因,我愿再出50分。
 
hank:回答完你的问题后,我就出去了。下面说说错误原因:
在你原来的程序中,
public void myServer() {
...
...
}
这个方法并不是你定义的类的构造器,因为
java规定类的构造器不能有返回值。而你的方法却返回了void,
所以在new myServer时,这一段根本就没有执行。listenSocket实际为null
错误当然就有了。

 
后退
顶部