确保在Kotlin初始化val

时间:2016-06-21 05:55:28

标签: 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);
}

当我将其转换为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并初始化它吗?

1 个答案:

答案 0 :(得分:12)

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

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

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