在 Java 中,网络异常通常属于 java.io.IOException 或其子类(最常见的是 java.net.SocketException、java.net.UnknownHostException、java.net.ConnectException 等)。下面从基本捕获方式、常见网络异常类型、最佳实践三个层面说明。
网络操作(如 Socket、URLConnection、HttpClient)必须处理异常:
import java.io.IOException;
import java.net.Socket;
public class NetDemo {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8080);
} catch (IOException e) {
System.out.println("网络异常:" + e.getMessage());
e.printStackTrace();
}
}
}
| 异常类 | 说明 |
|---|---|
IOException |
所有 I/O 异常的父类 |
SocketException |
Socket 通信异常(断网、重置) |
UnknownHostException |
域名无法解析 |
ConnectException |
连接被拒绝(端口未开) |
SocketTimeoutException |
连接或读取超时 |
NoRouteToHostException |
无法路由到主机 |
import java.net.*;
import java.io.*;
public class NetCatchDemo {
public static void main(String[] args) {
try {
Socket socket = new Socket("www.example.com", 80);
} catch (UnknownHostException e) {
System.out.println("域名解析失败");
} catch (ConnectException e) {
System.out.println("连接被拒绝");
} catch (SocketTimeoutException e) {
System.out.println("连接超时");
} catch (IOException e) {
System.out.println("其他网络异常");
}
}
}
⚠️ 捕获顺序必须从“子类 → 父类”
避免资源泄漏:
try (Socket socket = new Socket("localhost", 8080);
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()))) {
System.out.println(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
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(code);
} catch (SocketTimeoutException e) {
System.out.println("请求超时");
} catch (IOException e) {
System.out.println("网络错误");
}
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
try {
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (IOException e) {
System.out.println("网络异常");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
✅ 明确捕获具体异常
✅ 设置超时时间(防止线程卡死)
✅ 使用 try-with-resources
✅ 记录日志而不是只 printStackTrace()
✅ 对网络异常进行重试或降级处理
如果你有具体场景(如 Socket、HTTP、RPC、Spring、OkHttp),我可以给你更针对性的异常捕获方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。