kotlin之null值安全性

本文详细介绍了Kotlin中处理空值的三种操作符:安全调用(?.)、Elvis操作符(?:)和非空断言(!!),并展示了如何进行安全的类型转换。了解这些操作符能帮助开发者避免运行时NullPointerException,提高代码的安全性和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 var a: String =null // 编译错误
var a: String? =null // 编译通过

要允许null值, 需要将变量声明为可为null的字符串类型:String?

fun main(arg: Array<String>) {
    var a: String? =null
    print(a?.length)
}

上面代码是安全调用,如果为null则返回为null

Elcis操作符

fun main(arg: Array<String>) {
    val b: String? = null
    val len: Int = if (b != null) b.length else -1
   
    val len2: Int = b?.length ?: -1   //Elvis操作符表示形式是 ?:  等同于上面语句
    print(len)
    print(len2)

}

!!操作符

  val b: String? = null
    val s = b!!.length
    print(s)

如果b为null ,抛出NPE异常

安全类型的转换

fun main(arg: Array<String>) {
    val b: String? = null
    val s :Int?=b as? Int
    print(s)
}

如果转换失败则返回null

转载于:https://www.cnblogs.com/loaderman/p/10148912.html

### 关于 Kotlin 中 `null as` 类型转换的用法与行为 在 Kotlin 中,`as` 是一种显式的类型转换操作符。它允许开发者将对象从一个类型强制转换为另一个类型。然而,在涉及 `null` 的情况下,这种类型的转换具有特定的行为。 #### 1. **基本概念** 当尝试执行 `null as SomeType` 转换时,Kotlin 编译器会抛出异常而不是返回 `null` [^4]。这是因为 `as` 运算符的设计原则是严格的安全性检查机制。如果目标类型不兼容或者为 `null` 并且目标类型是非可空类型,则会在运行时触发 `ClassCastException` 异常。 ```kotlin val result: String = null as String // 将抛出 ClassCastException ``` 上述代码试图将 `null` 显式转换成不可为空的字符串类型 (`String`) ,这违反了类型系统的约束条件,因此必然失败并引发错误。 #### 2. **安全转型方式** 为了避免潜在的风险,可以采用更稳妥的方式来进行类型转换——即利用带有问号标记的安全转型运算符(`as?`) 。这种方式即使遇到无法完成的转化也不会崩溃程序流程而是简单地给出结果为 `null`. ```kotlin val safeResult: String? = null as? String // 安全转型成功后得到的是 null println(safeResult) // 输出:null ``` 这里展示了如何通过使用 `as?` 来实现更加健壮可靠的逻辑处理路径[^5]。 #### 3. **实际应用场景分析** 尽管直接书写像 `null as Type` 这样的表达式并不常见也容易造成问题,但在某些特殊场景下可能需要用到类似的技巧来满足业务需求: - 测试框架中的断言函数可能会接受任意类型的参数,并期望它们能被正确解释为目标形式; - 泛型方法内部需要临时假设某个变量属于某种具体类别以便继续后续计算过程; 这些情况都需要特别小心对待以防止意外状况发生。 --- ### 示例代码展示 下面提供一段简单的例子说明不同情形下的表现差异: ```kotlin fun main() { try { val unsafeCast: Int = null as Int println(unsafeCast) } catch (e: Exception){ println(e.message)// Expected output: "null cannot be cast to non-null type kotlin.Int" } val safeCast: Int? = null as? Int println(safeCast) // Outputs: null without throwing exception. } ``` 以上片段清晰对比了两种不同的做法及其后果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值