确保在Kotlin初始化val

Ric*_*ich 4 kotlin

我在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);
}
Run Code Online (Sandbox Code Playgroud)

当我将其转换为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)
Run Code Online (Sandbox Code Playgroud)

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

bob当Java编译器确定变量已初始化或抛出异常时,我无法看到Kotlin如何无法初始化变量.

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

mie*_*sol 12

use方法的结果分配给变量,如下所示:

bob = StringWriter().use { sw ->
    sw.write("this is a test")
    sw.toString()
}
Run Code Online (Sandbox Code Playgroud)

Java编译器能够确定变量将被初始化,因为try with resources是一种语言特性.use另一方面,该方法是一个库特征,其行为取决于实际导入和使用的实现.换句话说,Kotlin编译器无法知道作为参数传递的函数是否use会立即被调用.