在 Java 中处理网络异常,核心思路是:捕获异常、区分类型、合理重试或降级、记录日志。下面从常见异常、处理方式和示例代码几个方面说明。
Java 网络编程中常见异常主要来自 java.net 包:
IOException:最通用的 I/O 异常SocketException:Socket 连接异常(如连接被重置)ConnectException:连接失败(端口未开、网络不通)SocketTimeoutException:连接或读取超时UnknownHostException:域名无法解析MalformedURLException:URL 格式错误NoRouteToHostException:无路由到主机HttpURLConnectionimport java.net.*;
import java.io.*;
public class NetworkDemo {
public static void main(String[] args) {
try {
URL url = new URL("https://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
int code = conn.getResponseCode();
System.out.println("HTTP Code: " + code);
} catch (MalformedURLException e) {
System.err.println("URL格式错误: " + e.getMessage());
} catch (SocketTimeoutException e) {
System.err.println("网络超时: " + e.getMessage());
} catch (UnknownHostException e) {
System.err.println("无法解析主机: " + e.getMessage());
} catch (IOException e) {
System.err.println("网络IO异常: " + e.getMessage());
}
}
}
网络异常通常是可恢复的,可以加重试逻辑:
public static String requestWithRetry(String urlStr, int maxRetry) {
int retry = 0;
while (retry < maxRetry) {
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
return "success";
} catch (SocketTimeoutException e) {
retry++;
System.out.println("重试第" + retry + "次");
} catch (IOException e) {
break; // 不可恢复异常
}
}
return "failed";
}
import java.net.http.*;
import java.net.URI;
import java.time.Duration;
public class HttpClientDemo {
public static void main(String[] args) {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.timeout(Duration.ofSeconds(5))
.GET()
.build();
try {
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
} catch (java.net.ConnectException e) {
System.err.println("连接失败");
} catch (java.net.http.HttpConnectTimeoutException e) {
System.err.println("连接超时");
} catch (Exception e) {
System.err.println("其他异常: " + e.getMessage());
}
}
}
✅ 设置超时(连接 + 读取)
✅ 区分“可重试”和“不可重试”异常
✅ 使用日志框架(Logback / SLF4J)
✅ 避免吞异常(不要只 catch (Exception e) {})
✅ 高并发场景使用连接池(OkHttp / Apache HttpClient)
如果你有具体场景(如:Socket 通信、HTTP 接口调用、MQ、微服务调用),我可以给你更针对性的代码方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。