You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin可空接收器报错:n.compareTo(3)不允许,求非try-catch方案

Kotlin可空Int比较报错的解决方案

问题原因

Kotlin中,readln().toIntOrNull()返回的是Int?(可空整数类型):

  • ==运算符会自动处理null:当n为null时,n ==3直接返回false,不会触发错误,因为它内部调用的是支持可空类型的equals逻辑。
  • >这类比较运算符依赖Comparable接口的compareTo方法,而可空类型Int?不能直接调用非空类型的compareTo方法,因此报错。

修正方案(无需try/catch)

方案1:先判断非空再比较(最直观)

通过n != null进行非空判断,Kotlin会自动进行智能转换,将判断后的n视为非空Int:

val n = readln().toIntOrNull()
if (n != null && n > 3) {
    println(n)
}

方案2:使用安全调用+compareTo

利用安全调用?.访问compareTo方法,再判断返回值(返回1表示大于目标值):

val n = readln().toIntOrNull()
if (n?.compareTo(3) == 1) {
    println(n)
}

方案3:Elvis运算符指定null的替代值

用Elvis运算符?:给null设置一个肯定不满足条件的默认值,确保null时不会进入分支:

val n = readln().toIntOrNull()
if ((n ?: Int.MIN_VALUE) > 3) {
    println(n)
}

这里用Int.MIN_VALUE是因为它远小于3,当n为null时,条件不成立,不会执行println。

方案4:用let函数处理非空场景

通过let函数仅在n非空时执行后续逻辑:

val n = readln().toIntOrNull()
n?.let { nonNullNum ->
    if (nonNullNum > 3) {
        println(nonNullNum)
    }
}

内容的提问来源于stack exchange,提问作者Jaguar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:45:07