if должно иметь обе ветви main и else, если используется как выражение - PullRequest
0 голосов
/ 04 августа 2020

У меня раньше работал приведенный ниже код, теперь компилятор останавливает и отмечает оба оператора if и говорит:

'if' должно иметь обе ветви main и else, если используется как выражение

Но, как вы видите, это не выражение, а просто оператор равенства и условный оператор рядом с ним.

                    try {
                        val json_string = responseBody!!.string()
                        val jsonObject = JSONObject(json_string)
                        if (jsonObject.has("version")) {

                            val remoteVersion = jsonObject.getInt("version")
                            if (remoteVersion > BuildConfig.VERSION_CODE) {
                                handler.post {
                                    showInstallNewVersionDialog()
                                }
                            }
                        }
                    } catch (e: Exception) {
                        e.message?.let { Log.e(Constants.TAG, e.message!!) }

                    }

Забавно, если я добавил пустое else теги, он будет работать, но предупредит об удалении пустых else операторов:

                        if (jsonObject.has("version")) {

                            val remoteVersion = jsonObject.getInt("version")
                            if (remoteVersion > BuildConfig.VERSION_CODE) {
                                handler.post {
                                    showInstallNewVersionDialog()
                                }
                            } else {}
                        } else {}

1 Ответ

0 голосов
/ 04 августа 2020

Если IDE сообщает вам, что 'if' must have both main and 'else' branches if used as an expression, то это так. Скорее всего, эта конструкция try-catch определяется как пользовательский получатель переменной или как функция с одним выражением .

Пример:

val aVariable =
    try {
        if (System.currentTimeMillis() == 0L) {
            println("It is 1970-01-01")
        }
    } catch (e: Exception) {
        // empty
    }

fun aFunction() =
    try {
        if (System.currentTimeMillis() == 0L) {
            println("It is 1970-01-01")
        }
    } catch (e: Exception) {
        // empty
    }

И IDE (lint) показывает мне ошибку еще до компиляции. Та же ошибка для функции.

Сообщение об ошибке

Чтобы исправить эту проблему, вы либо вводите оператор else, либо повторно объявляете эту переменную как функцию (или обновляете имеющуюся функцию). Эта функция будет работать нормально, поскольку она всегда возвращает Unit, даже если у вас нет кода.

fun aFunction() {
    try {
        if (System.currentTimeMillis() == 0L) {
            println("It is 1970-01-01")
        }
    } catch (e: Exception) {
        // empty
    }
}

Когда вы используете функции с одним выражением или геттеры, вы ДОЛЖНЫ возвращать ценность. Поэтому обязательна деталь else.

...