Kotlin:“synchronized”使编译器不能确定变量的初始化

让我们设想下一个Kotlin代码,它通过一个JDBC连接器对数据库执行一些查询:

var results : ResultSet preparedStatement.clearParameters() preparedStatement.setInt(1,value1); preparedStatement.setInt(2,value2) results = preparedStatement.executeQuery() while(results.next()) { // parse results } 

编译没有问题。 但是,当我尝试添加线程安全性以访问preparedStatement时:

  var results : ResultSet synchronized(preparedStatement) { preparedStatement.clearParameters() preparedStatement.setInt(1,value1); preparedStatement.setInt(2,value2) results = preparedStatement.executeQuery() } while(results.next()) { // parse results } 

…我得到了一个“变量”结果“必须初始化” 。 看起来synchronized块作为一个条件块,但你可以肯定它会在while块之前执行一次。

我已经在Java中实现了这个相同的块,我没有得到错误。 这是Kotlin的设计/实现错误吗? 还是有一个很好的理由来表达呢?

synchronized只是一个内联函数,编译器不知道lambda是否会执行一次,甚至执行。 习惯的方法是从lambda返回值并将其赋值给本地:

 val results = synchronized(preparedStatement) { preparedStatement.clearParameters() preparedStatement.setInt(1,value1); preparedStatement.setInt(2,value2) preparedStatement.executeQuery() }