You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中while死循环导致无法访问循环外response变量问题

解决Socket死循环无法执行后续代码的问题

你的核心问题是**while(true)是无终止条件的死循环**,程序永远跳不出循环,导致循环后的代码(包括打印最终response的Log)永远无法执行。另外当前的字节读取逻辑也存在可优化的地方,以下是修复方案:

修复后的代码

try {
    socket = Socket()
    socket.connect(InetSocketAddress(IP, PORT))
    val out = DataOutputStream(socket.getOutputStream())
    val dataIn = DataInputStream(socket.getInputStream())
    out.writeBytes(sending)
    
    val responseBuilder = StringBuilder() // 用StringBuilder提升字符串拼接效率
    var byteIn: Byte

    try {
        // 循环读取字节,直到流结束抛出EOFException
        while (true) {
            byteIn = dataIn.readByte()
            responseBuilder.append(byteIn.toChar())
            Log.d("Response response", responseBuilder.toString())
            Log.d("ByteIn Byte In", byteIn.toString())
        }
    } catch (e: EOFException) {
        // 捕获流结束异常,正常退出循环
        Log.d("Stream Status", "输入流已读取完毕")
    }

    val response = responseBuilder.toString()
    Log.d("Final Response", response) // 现在可以正常执行到这里

} catch (e: IOException) {
    e.printStackTrace()
} finally {
    // 确保资源被关闭,避免泄漏
    try {
        dataIn?.close()
        out?.close()
        socket?.close()
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

关键修复点说明

  1. 终止死循环:
    DataInputStream.readByte()在服务器关闭输出流、输入流无更多数据时,会抛出EOFException。通过捕获这个异常,就能正常终止循环,让后续代码得以执行。

  2. 优化字符串拼接:
    循环中直接用response += ...会频繁创建新的String对象,性能低下。改用StringBuilder进行拼接,最后再转为String,效率更高。

  3. 资源安全关闭:
    添加finally块,确保Socket、输入输出流无论是否发生异常都能被正确关闭,避免资源泄漏。

内容的提问来源于stack exchange,提问作者winfred adrah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:42:25