未处理的异常:必须捕获或抛出IOException

时间:2015-05-01 13:35:12

标签: java netbeans exception-handling

所以最近我开始使用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进行编译。它仍然给出了相同的错误

1 个答案:

答案 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