gpt4 book ai didi

java - 未处理的异常 : IOException must be caught or thrown

转载 作者:行者123 更新时间:2023-12-01 11:35:58 25 4
gpt4 key购买 nike

最近我开始用 Java 开发自己的 IRC 客户端/服务器。 NetBeans 说我有一个未处理的 IOException。但是,查看我的代码,我执行了一个捕获 IOException 的 try-catch block 。这是我的代码:

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;
}
}

请注意,try...catch 中的 IOException 实际上是 java.io.IOExecption

什么原因导致编译错误?

编辑:我在 Eclipse 中尝试了相同的代码,并通过 cmd 编译它。仍然报同样的错误

最佳答案

您的问题是您的类既扩展了 ServerSocket 又具有 ServerSocket 字段。这意味着对于每个 IRCServer 实例,理论上您都有两个 ServerSocket 实例。一种是 IRCServer 本身,因为它扩展了它,另一种是您命名为 server 的嵌入式 ServerSocket

这本身就是一个严重的设计问题 - 如果您实际上不以任何方式依赖其原始功能,则无需扩展类。如果您打算将 IRCServer 用作 ServerSocket,则不应再嵌入一个额外的服务器。this 将成为您的 服务器

但是导致编译错误的问题是每个构造函数都隐式或显式调用 super() 构造函数。如果原始类有一个无参数构造函数 - 它确实如此 - 那么如果你自己无法调用 super(...) ,它会为你完成。

但是,ServerSocket 的构造函数声明为:

public ServerSocket() throws IOException

public ServerSocket(int port) throws IOException

这意味着对 super() 构造函数的隐式调用发生在 try...catch 之前,并且它会抛出一个检查异常。这意味着您必须将自己的构造函数声明为 throws IOException,因为无法使用 try...catch< 包围 super() 调用.

我的建议是要么适当扩展类,要么委托(delegate)而不扩展。正确扩展意味着没有服务器变量。你的构造函数看起来像:

/**
* <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.

关于java - 未处理的异常 : IOException must be caught or thrown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com