MST
星途 面试题库

面试题:Java Socket异常处理中的资源管理

在Java Socket编程时,当发生异常时如何正确地处理相关资源(如Socket连接、输入输出流等)以避免资源泄漏?请结合代码示例说明。
21.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java Socket编程中,为避免资源泄漏,可使用try - catch - finally块或try - with - resources语句。以下是两种方式的示例:

使用try - catch - finally

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class SocketResourceHandlingTryCatchFinally {
    public static void main(String[] args) {
        Socket socket = null;
        BufferedReader in = null;
        PrintWriter out = null;

        try {
            socket = new Socket("localhost", 1234);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);

            // 进行Socket通信操作
            out.println("Hello, Server!");
            String response = in.readLine();
            System.out.println("Server response: " + response);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

使用try - with - resources(Java 7及以上)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class SocketResourceHandlingTryWithResources {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 1234);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {

            // 进行Socket通信操作
            out.println("Hello, Server!");
            String response = in.readLine();
            System.out.println("Server response: " + response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

try - catch - finally方式中,手动在finally块中关闭资源,确保无论是否发生异常,资源都会被关闭。而try - with - resources语句更简洁,Java会自动在语句结束时关闭实现了AutoCloseable接口的资源,包括SocketBufferedReaderPrintWriter,从而有效避免资源泄漏。