验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

Java网络异常处理怎么做

阅读:378 来源:乙速云 作者:代码code

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 / 微服务,可以告诉我,我可以给你更具体的处理方式。

分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>