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() } }
关键修复点说明
终止死循环:
DataInputStream.readByte()在服务器关闭输出流、输入流无更多数据时,会抛出EOFException。通过捕获这个异常,就能正常终止循环,让后续代码得以执行。优化字符串拼接:
循环中直接用response += ...会频繁创建新的String对象,性能低下。改用StringBuilder进行拼接,最后再转为String,效率更高。资源安全关闭:
添加finally块,确保Socket、输入输出流无论是否发生异常都能被正确关闭,避免资源泄漏。
内容的提问来源于stack exchange,提问作者winfred adrah
相关产品推荐
相关产品推荐

