所以最近我开始使用Java自己的IRC客户端/服务器。 NetBeans说我有一个未处理的IOException。但是,查看我的代码,我会执行一个捕获IOException的try-catch块。这是我的代码:
package some.package.name;
import java.io.IOException;
import java.net.ServerSocket;
public class IRCServer extends ServerSocket {
private ServerSocket server;
private int port;
/**
* <p>Main constructor. Provides default port of 6667</p>
*/
public IRCServer() {
this(6667);
}
/**
* <p>Secondary constructor. Uses port defined by either user or Main constructor</p>
*
* @param port The port to listen to for the server
*/
public IRCServer(int port) { //This is where NetBeans show the error
this.port = port;
try {
server = new ServerSocket(port);
} catch (IOException e) {
System.err.println("IOException caught\n" + e.toString());
}
}
/**
* <p>Overrides parent String toString()</p>
*
* @return PORT the server is listening to
*/
@Override
public String toString() {
return "PORT: " + this.port;
}
}
请注意,IOException
中的try...catch
确实是java.io.IOExecption
。
导致编译错误的原因是什么?
编辑:我在Eclipse中尝试了相同的代码,并通过cmd进行编译。它仍然给出了相同的错误答案 0 :(得分:1)
您的问题是,您的课程都扩展了ServerSocket
并且有一个ServerSocket
字段。这意味着对于IRCServer
的每个实例,理论上你有两个 ServerSocket
个实例。一个是IRCServer
本身,因为它扩展了它,一个是您命名为ServerSocket
的嵌入式server
。
这本身就是一个严重的设计问题 - 如果您实际上没有以任何方式依赖其原始功能,则无需扩展类。如果您打算将IRCServer
用作ServerSocket
,则不应该嵌入其中一个。this
成为您的server
。
但导致编译错误的问题是每个构造函数都隐式或显式调用super()
构造函数。如果原始类有一个no-args构造函数 - 而且确实如此 - 那么如果你自己没有调用super(...)
,那么它就会为你完成。
但是,ServerSocket
的构造函数声明为:
public ServerSocket() throws IOException
和
public ServerSocket(int port) throws IOException
这意味着对super()
构造函数的隐式调用在之前发生在try...catch
之前,它会抛出一个已检查的异常。这意味着您必须将自己的构造函数声明为throws IOException
,因为无法用super()
包围try...catch
调用。
我的建议是要正确地扩展课程,要么不延长课程。正确扩展意味着没有server
变量。你的构造函数看起来像:
/**
* <p>Main constructor. Provides default port of 6667</p>
*/
public IRCServer() throws IOException {
this(6667);
}
/**
* <p>Secondary constructor. Uses port defined by either user or Main constructor</p>
*
* @param port The port to listen to for the server
*/
public IRCServer(int port) throws IOException {
super(port);
this.port = port;
}
正确委派意味着保留大部分原始代码但删除extends ServerSocket
,然后您将无法IRCServer
多态地使用ServerSocket
。