kotlin中BufferedReader转换成String字符串的坑
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()
}
``` |
|
|
|
|
|