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
相关产品推荐
相关产品推荐

