在Scala中循环时检查null,异常行为

时间:2015-10-15 09:11:25

标签: scala while-loop

我正在使用表格

使用InputStream汇总BufferedReader的内容
while( (str = br.readLine()) != null){
  sb.append(str)
}

但是这很快导致了OutOfMemoryError,因为空检查无法获取空值并且StringBuffer的大小不断增加......

我已经确认str的值为null,并且已验证它不是"null"

将我的代码重构为

str = br.readLine()
while(str != null){
  sb.append(str)
  str = br.readLine()
}

有效,但我不知道这会有什么不同。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

在scala中,表达式str = br.readline()产生类型Unit的返回值,它始终不等于null。它本应该给你一个关于将Unit与null进行比较的警告。

你这样重构是正确的。

P.S。正如@Jesper正确评论了您的问题,这不是您通常在scala中读取文件的方式。所以,如果你这样做 - 请使用他的代码示例。如果您有其他InputStream,则可以使用Source.fromInputStream

答案 1 :(得分:0)

Archeg已经解释得很漂亮所以试试这个:

var str = ""
while({str = br.readLine; str != null}) {

}

由于您使用的是Scala,请尝试使用

scala.io.Source.fromInputStream(is).getLines().mkString("\n")

 val bufferedReader = new BufferedReader(inputStreamReader)
 Iterator continually bufferedReader.readLine takeWhile (_ != null) mkString