Kotlin中!!用法

      在 Kotlin 中,两个 !!(也称为 "not-null assertion operator")用于将一个可空类型(nullable type)转换为非空类型(non-null type)。

      使用 !! 操作符时,Kotlin 编译器会假定该变量不为 null。如果该变量在运行时为 null,将抛出 KotlinNullPointerException

示例代码

假设有一个类 Experiment,它包含一个可空类型的属性 flowSetting,该属性又包含一个 stages 属性:

class FlowSetting(val stages: List<String>?) 
class Experiment(val flowSetting: FlowSetting?)

以下是使用 !! 操作符的示例:

fun main() { 
    val experiment = Experiment(FlowSetting(listOf("Stage1", "Stage2", "Stage3"))) 
    val stages = experiment.flowSetting!!.stages println(stages) 
    // 输出: [Stage1, Stage2, Stage3] 
    val experimentWithNullFlowSetting = Experiment(null)   
    val stagesWithNullFlowSetting = experimentWithNullFlowSetting.flowSetting!!.stages 
    // 这里会抛出 KotlinNullPointerException,因为 flowSetting 为 null }

解释

  • experiment.flowSetting!!: 这个表达式表示非常确定 flowSetting 不为 null。如果 flowSetting 为 null,会抛出 KotlinNullPointerException
  • experiment.flowSetting!!.stages: 在确保 flowSetting 不为 null 之后,访问其 stages 属性。

注意事项

使用 !! 操作符时需要非常小心,因为它可能会导致程序在运行时抛出 KotlinNullPointerException。通常建议尽量避免使用 !!,而是使用更安全的处理可空类型的方法,如安全调用操作符 ?.letrun 等。

安全替代方案

  1. 安全调用操作符 ?.

    val stages = experiment.flowSetting?.stages 
        if (stages != null) { 
        println(stages) 
        } 
        else { 
        println("FlowSetting or stages is null") 
        }
  2. let 函数

    experiment.flowSetting?.let { 
        flowSetting -> val stages = flowSetting.stages println(stages) 
    }
  3. if 检查

    if (experiment.flowSetting != null) { 
        val stages = experiment.flowSetting!!.stages println(stages) 
    } 
    else { 
        println("FlowSetting is null") 
    }

示例程序

以下是一个更安全的示例,使用了安全调用操作符 ?.let 函数:

class FlowSetting(val stages: List<String>?) 
class Experiment(val flowSetting: FlowSetting?) 
fun main() { 
  val experiment = Experiment(FlowSetting(listOf("Stage1", "Stage2", "Stage3")))         
  experiment.flowSetting?.let { flowSetting -> 
  val stages = flowSetting.stages println(stages) 
  // 输出: [Stage1, Stage2, Stage3] } ?: println("FlowSetting is null") 
  val experimentWithNullFlowSetting = Experiment(null) 
  experimentWithNullFlowSetting.flowSetting?.let { flowSetting -> 
  val stages = flowSetting.stages println(stages) } ?: println("FlowSetting is null") 
  // 输出: FlowSetting is null
 }

这样可以避免潜在的 KotlinNullPointerException,同时更安全地处理可空类型。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kotlin 是一种现代的静态类型编程语言,可以运行在 Java 虚拟机上,也可以编译成 JavaScript。它是由 JetBrains 开发的,并于2016年首次公开发布。Kotlin 最初是设计用于解决 Java 语言的一些问题,如繁琐的样板代码、空指针异常等。现在,Kotlin 已经成为一种流行的编程语言,被广泛用于 Android 开发、服务器端开发和其他应用程序。 "!!" 是 Kotlin 的一个非常重要的操作符,称为 "非空断言运算符",可以将一个可空类型的变量转换为非空类型。但是使用该操作符需要非常谨慎,因为如果变量为 null,则会抛出 NullPointerException 异常。 ### 回答2: Kotlin的"!!"是一种语言特性,表示对一个对象进行非空断言。它的作用是告诉编译器,我确定这个对象一定不为空,不需要进行空检查。 在Kotlin,对象可以分为可空类型和不可空类型。如果我们使用可空类型的对象调用一个方法或属性,编译器会强制我们进行空检查,以防止空指针异常的发生。但是有时候我们明确知道一个对象不可能为空,可以使用"!!"操作符来告诉编译器不需要空检查。 然而,使用"!!"操作符需要谨慎,因为如果我们错误地对一个为空的对象使用"!!",就会导致空指针异常的发生。因此,在使用"!!"操作符时,我们需要确保对象一定不为空,否则会抛出运行时异常。 总结来说,Kotlin的"!!"是一种用于对不可能为空的对象进行非空断言的语言特性。它可以帮助我们避免不必要的空检查,但同时也需要我们谨慎使用,确保对象一定不为空。 ### 回答3: "kotlin !!" 是 Kotlin 编程语言的一种运算符的写法。 在 Kotlin ,"!!" 表示非空断言(Non-null Assertion)运算符。当我们在代码使用 "!!" 运算符时,它的作用是告诉编译器一个承诺,即该对象不会为 null,可以放心地调用其属性或方法。 使用 "!!" 运算符需要注意,如果对象为 null,那么在运行时会抛出 KotlinNullPointerException 异常。因此,在使用 "!!" 运算符之前,需要确保该对象不为 null,否则会导致程序崩溃。 非空断言运算符 "!!" 的使用场景通常是在代码已经判断了对象不为 null 的情况下,为了更方便地调用对象的属性或方法,可以使用该运算符来省略不必要的空检查代码。 总之,"kotlin !!" 是 Kotlin 编程语言的一个运算符,表示非空断言,用于告诉编译器对象不为 null,可以安全地调用其属性或方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值