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)
如果 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
需要部分。
归档时间: |
|
查看次数: |
3883 次 |
最近记录: |