Java网络异常处理怎么做
在 Java 中进行网络异常处理,核心思路是:
捕获异常 → 判断异常类型 → 合理处理(重试 / 提示 / 回退 / 记录日志)。下面从常见异常、处理方式和示例代码来说明。
一、常见的 Java 网络异常
1️⃣ java.net 包常见异常
| 异常 | 含义 |
|---|---|
UnknownHostException |
域名无法解析 |
ConnectException |
连接被拒绝(端口未监听) |
SocketTimeoutException |
连接或读超时 |
NoRouteToHostException |
无法路由到主机 |
BindException |
端口已被占用 |
ProtocolException |
协议错误 |
2️⃣ java.io 相关异常
| 异常 | 含义 |
|---|---|
IOException |
通用 I/O 异常 |
EOFException |
连接提前关闭 |
二、基础异常处理方式(try-catch)
示例:HTTP 请求异常处理
import java.net.*;
import java.io.*;
public class NetworkDemo {
public static void main(String[] args) {
try {
URL url = new URL("https://www.example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
int code = conn.getResponseCode();
System.out.println("响应码:" + code);
} catch (UnknownHostException e) {
System.err.println("无法解析主机:" + e.getMessage());
} catch (SocketTimeoutException e) {
System.err.println("连接或读取超时");
} catch (ConnectException e) {
System.err.println("连接被拒绝,服务器未启动");
} catch (IOException e) {
System.err.println("网络 IO 异常:" + e.getMessage());
}
}
}
✅ 建议:先捕获具体异常,再捕获 IOException
三、Socket 编程中的异常处理
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 8080);
socket.setSoTimeout(5000);
} catch (UnknownHostException e) {
System.err.println("未知主机");
} catch (ConnectException e) {
System.err.println("连接失败");
} catch (SocketTimeoutException e) {
System.err.println("读取超时");
} catch (IOException e) {
System.err.println("IO 异常");
} finally {
if (socket != null && !socket.isClosed()) {
try {
socket.close();
} catch (IOException ignored) {}
}
}
四、重试机制(网络异常常用)
int retry = 3;
while (retry > 0) {
try {
// 网络操作
break;
} catch (SocketTimeoutException e) {
retry--;
System.err.println("超时重试,剩余次数:" + retry);
}
}
✅ 可配合 指数退避:
Thread.sleep((3 - retry) * 1000L);
五、使用日志而不是 printStackTrace()
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger log = LoggerFactory.getLogger(NetworkDemo.class);
try {
// 网络代码
} catch (IOException e) {
log.error("网络请求失败", e);
}
六、HTTP 客户端(推荐方式)
✅ Java 11+ HttpClient
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(3))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.timeout(Duration.ofSeconds(3))
.build();
try {
HttpResponse response = client.send(
request, HttpResponse.BodyHandlers.ofString());
} catch (HttpTimeoutException e) {
System.err.println("请求超时");
} catch (IOException e) {
System.err.println("网络异常");
}
七、异常处理最佳实践 ✅
✅ 不要吞异常
✅ 区分可恢复异常 vs 不可恢复异常
✅ 设置合理的超时时间
✅ 网络操作必须关闭资源
✅ 生产环境使用日志框架
八、总结一句话
Java 网络异常处理 = 明确异常类型 + 合理重试 + 超时控制 + 资源释放 + 日志记录
如果你使用的是 Spring / OkHttp / Netty / 微服务,可以告诉我,我可以给你更具体的处理方式。