我在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
并初始化它吗?
答案 0 :(得分:12)
将use
方法的结果分配给变量,如下所示:
bob = StringWriter().use { sw ->
sw.write("this is a test")
sw.toString()
}
Java编译器能够确定该变量将被初始化,因为try with resources是一种语言特性。另一方面,use
方法是一个库特征,其行为取决于实际导入和使用的实现。换句话说,Kotlin编译器无法知道作为use
的参数传递的函数是否会立即被调用。