如果用作表达式,'if' 必须同时具有 main 和 'else' 分支

AVE*_*imi 7 android if-statement conditional-statements kotlin

我以前有下面的代码工作,现在编译器停止并标记两个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!!) }

}
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我添加了空else标签,它会运行但会警告删除空else语句:

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

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

小智 10

问题在于 Kotlin 将try {} catch {}构造视为返回值的“函数”,这与 Java 不同try {} catch {}。因此,编译器会假设您“忘记”对else分支进行编码,即使您显然不想返回任何值。Kotlin 有时很可笑。

即你可以写:

val t = try {
  "test"
} catch (e: Exception) {
  "error"
}
println(t)
Run Code Online (Sandbox Code Playgroud)


Jen*_*anu 9

如果 IDE 告诉你,'if' must have both main and 'else' branches if used as an expression那就是这样。这种 try-catch 构造很可能被定义为变量的自定义 getter 或单表达式函数

一个例子:

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
    }
Run Code Online (Sandbox Code Playgroud)

IDE(lint)甚至在编译之前就显示错误。该函数出现同样的错误。

错误信息

要解决此问题,您可以引入 else 语句或将此变量重新声明为函数(或更新您拥有的函数)。该函数可以正常工作,因为Unit即使您没有任何代码,它也总是返回。

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

当您使用单表达式函数或 getter 时,您必须返回一个值。这就是为什么else需要部分。

  • 这怎么能解决呢?我看不出它与问题相符。没有变量赋值。我也有同样的问题。我有一个针对 Retrofit 请求的响应处理程序,我在其中检查了一些本地值。如果它们为空,我不必对响应数据做我能做的一切。工作完美。直到我认识到如果我不希望应用程序在登录过期时崩溃,我必须捕获 HTTP 异常。当我用“try{..}”包围“if”时,IDE 就会告诉我添加“else”分支。如果我添加“else {}”,一切都会按预期工作,但代码检查会抱怨正文为空。 (2认同)