Почему kotlin предоставляет нулевой оператор безопасности, а не оператор безопасности исключений? - PullRequest
0 голосов
/ 09 марта 2020

Если kotlin поддерживает код safe , такой как:

val currentName = "Some Guy"
getDataFromServer()?.getUsers()?.find { it.name == currentName }?.profilePicture?.let {
  showPicture(it)
} ?: let {
  showAddPictureButton()
}

Почему нет аналогичного синтаксиса для обработки исключений, например, с использованием мнимого оператора ??.:

val someUserId = 123
val newName = "Cool Dude"
connectToDatabase()??.getDao<UserDao>()??.changeUserName(someUserId, newName)??.let { newUserData ->
  reloadView(newUserData)
} ??: let { error ->
  interpretAndHandleError(error)
}

Я не вижу здесь недостатков. Есть ли причина, по которой это не является частью языка?

1 Ответ

4 голосов
/ 10 марта 2020

Дело не в недостатках, а в отсутствии достаточных преимуществ. Попробуйте написать свой первый пример без ?.:

val data = getDataFromServer()
if (data != null) {
    val users = data.getUsers()
    if (users != null) {
        val user = users.find { it.name == currentName }
        if (user != null) ...
    } else null
} else null

Вы можете видеть, что он намного сложнее, чем исходный код. Теперь попробуйте написать предложенное ??. без него:

try {
    connectToDatabase().getDao<UserDao>().changeUserName(someUserId, newName).let { newUserData ->
        reloadView(newUserData)
    }
} catch(error: Exception) { 
    interpretAndHandleError(error)
}

Где сложность, которую вы хотите устранить?

...