Обеспечение инициализации 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); } 

Когда я конвертирую это в Котлин:

  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.

Я не вижу, как Kotlin не смог инициализировать переменную bob когда компилятор Java настолько уверен, что переменная либо была инициализирована, либо выбрано исключение.

Является ли мой единственный способ изменить bob на var и инициализировать его?

Назначьте результат use метода такой переменной:

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

Компилятор Java может понять, что переменная будет инициализирована, потому что попытка с ресурсами является языковой функцией. Метод use с другой стороны, представляет собой библиотечную функцию с поведением, зависящим от реализации, которая фактически импортирована и используется. Другими словами, компилятор Kotlin не знает, будет ли функция, переданная как аргумент для use , вызываться немедленно или нет.