确保在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编译器非常确定variables已经被初始化或抛出exception时,我看不出Kotlin可能无法初始化bobvariables。

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

One Solution collect form web for “确保在Kotlin中初始化val”

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

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

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

  • 在多个接收器上调用一个通用的方法
  • 什么代表Kotlin中的arrayOfNulls?
  • 将多个方法合并为一个函数的方法
  • Kotlin:对象与同伴对象之间的区别
  • 如何检查字符串不等于一个字符串,那么它将工作,否则没有? 在kotlin
  • 从Long到ByteArray的两次转换有什么区别?
  • Gradle 3.0.0-alpha1与kotlin-android插件1.1.2-3不兼容?
  • types推断在kotlin中失败
  • 我如何使用Kotlin运行单个Android测试?
  • 我怎样才能创建一个Kotlin像Java一样的数组呢?
  • 如何将intArray转换为Kotlin中的ArrayList ?
  • Kotlin language will be the best programming language for Android.