温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java怎么处理网络异常

发布时间:2026-09-13 00:53:36 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

在 Java 中处理网络异常,核心思路是:捕获异常、区分类型、合理重试或降级、记录日志。下面从常见异常、处理方式和示例代码几个方面说明。


一、常见网络相关异常

Java 网络编程中常见异常主要来自 java.net 包:

  • IOException:最通用的 I/O 异常
  • SocketException:Socket 连接异常(如连接被重置)
  • ConnectException:连接失败(端口未开、网络不通)
  • SocketTimeoutException:连接或读取超时
  • UnknownHostException:域名无法解析
  • MalformedURLException:URL 格式错误
  • NoRouteToHostException:无路由到主机

二、基本处理方式(try-catch)

1. 使用 HttpURLConnection

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

四、使用 HttpClient(Java 11+,推荐)

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)


六、常见第三方库推荐

  • OkHttp:自动重试、连接池
  • Apache HttpClient:企业级、配置丰富
  • Spring RestTemplate / WebClient:Spring 项目首选

如果你有具体场景(如:Socket 通信、HTTP 接口调用、MQ、微服务调用),我可以给你更针对性的代码方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手