回答

收藏

kotlin中BufferedReader转换成String字符串的坑

Kotlin Kotlin 24319 人阅读 | 0 人回复 | 2020-10-24

*本帖最后由 LazyGirl 于 2020-10-24 16:26 编辑*

# kotlin中BufferedReader转换成String字符串的坑
今天遇到一个问题,把Java中的网络请求客户端的类转移到kotlin中报空指针异常:
> java.lang.NullPointerException: it must not be null

源代码是这样的:
```Java
BufferedReader reader = new BufferedReader(new InputStreamReader(
        connection.getInputStream()));
String lines;
StringBuffer resposeBuffer = new StringBuffer("");
while ((lines = reader.readLine()) != null) {
    lines = new String(lines.getBytes(), "utf-8");
    resposeBuffer.append(lines);
}
```
转移到Kotlin当中是这样的:
```kotlin
val reader = BufferedReader(
    InputStreamReader(
        connection.inputStream
    )
)
var lines: String
val resposeBuffer = StringBuffer("")
while (reader.readLine().also { lines = it } != null) {
    lines = String(lines.toByteArray(), Charset.forName("utf-8"))
    resposeBuffer.append(lines)
}
```
由于是集成在项目中的,所以在报错之后一直无法定位问题,并且在debug的时候reader.readLine是没有任何问题的,故而迟迟没有发现问题,经过一系列的排查,最终将问题锁定在**while**这个循环里了,使用了很多方法,例如do while可以解决空指针,但是会引发另外一个问题:除第一行外的其他行缺少首字符,最后发现kotlin中有按行读取文件,即**Reader.useLines**,所以就成功解决了以上问题:
```kotlin
val reader = BufferedReader(
    InputStreamReader(
        connection.inputStream
    )
).useLines { lines ->
    val results = StringBuilder()
    lines.forEach {
        results.append(it)
    }
    results.toString()
}
```
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则