确保在Kotlin中初始化val

在Java中我有以下方法:

public void doSomething() { final boolean promote = false; final String bob; if (promote) { try(StringWriter sw = new StringWriter()) { sw.write("this is a test"); bob = sw.toString(); } catch (IOException e) { e.printStackTrace(); throw new IllegalStateException(); } } else { bob = "anaconda"; } System.out.println(bob); } 

当我把它转换成Kotlin时:

  val promote = false val bob: String if (promote) { try { StringWriter().use { sw -> sw.write("this is a test") bob = sw.toString() } } catch (e: IOException) { e.printStackTrace() throw IllegalStateException() } } else { bob = "anaconda" } println(bob) 

但是在最后一行我得到一个编译器错误: Variable 'bob' must be initialized.

当Java编译器非常确定变量已经被初始化或抛出异常时,我看不出Kotlin可能无法初始化bob变量。

我唯一的选择是将bob更改为var并初始化它?

use方法的结果赋值给变量,如下所示:

 bob = StringWriter().use { sw -> sw.write("this is a test") sw.toString() } 

Java编译器能够发现变量将被初始化,因为尝试使用资源是一种语言功能。 另一方面, use方法是一个库特性,其行为取决于实际导入和使用的实现。 换句话说,Kotlin编译器无法知道函数是否作为参数传递,是否立即被调用。