kotlin(五) null

NULL

1.1 空指针
        在Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null。这使得在Java中我们司空见惯的空指针异常NullPointerException,带给了我们很多麻烦。

        Kotlin 的类型系统旨在从我们的代码中消除 NullPointerException。
 除非另有规定,变量不可为null值,这样一来,运行时崩溃从根源上得到解决。

var name:String
println(name)//直接报错

1.2 可空性(?)

        Kotlin区分可空类型和非可空类型,所以,你要一个可空类型变量运行,而它又可能不存在,对于这种潜在危险,编译器时刻警惕着。为了应对这种风险,Kotlin不允许你在可空类型值上调用函数

 那么完美如何使得变量变为可空类型。

定义一个可空类型的变量的格式为:修饰符 变量名 :类型? = 值

var  sex:Int?
sex=1

1.3 安全调用操作符(?.)

  • 可空类型变量?.属性/函数。如果可空类型变量为null时,后面就不会执行。避免null异常

    返回null

  • 能有效避免空引用异常(NullPointException),因为只要链式其中的一个为null,则整个表达式都为null

println("\n-------------安全调用操作符(?.)------------------------------")
var age:Int?=15
 age=null
println(age)

  if (age!=null) {
      age.and(20)
  }

1.4 let操作符

let的用法:变量?.let{ … }

let操作符的作用:如果为null 后面不执行

   println("\n-------------let 给null赋值-----------------------------")
    var  type:String? ="android"
    type =type?.let { if(it.isNotBlank()){
        "$it 非空字符串"
    }else{

        "java"
    } }
    println(type)//android 非空字符串
    type=""
    type =type?.let { if(it.isNotBlank()){
        "$it "
    }else{
        "koltin"
    } }
    println(type)//kotlin

1.5 使用非空断言操作符(!!.)

!!. 又称感叹号操作符,不管是否为null 都会执行,当变量值为null时,会抛出NullPointerException

    println("\n------------- (!!.)  抛出空指针异常  -----------------------------")
    var  excep:String?=null
   // println(excep!!.length) 抛出异常

1.6 使用空合并操作符(?:)  

?:操作符的意思是,如果左边的求值结果为null,就使用右边的结果值。

println("\n------------- (?:)  -----------------------------")
var  excep1:String?=null
println(excep1?:0)

使用?:+let代替if/else

    println("\n-------------使用?:+let代替if/else-----------------------------")
    var nulls:String?=""
    println(nulls?.let { "空字符" }?:"空值")//空字符
    nulls =null
    println(nulls?.let { "空支付" }?:"空值")//空值

1.7 使用类型转换操作符(as)

1.7.1 不安全的转换操作符:as

    println("\n-------------as-----------------------------")
    var ass:String?=""
   // println(ass as Int)ClassCastException

1.7.8 安全转换操作符:as?

        as?安全地转换成一种类型。 如果无法进行转换,则返回null,而不是抛出ClassCastException异常。

   println("\n-------------as?  安全不会报错- ----------------------------")
    var assS:String?=""
  println(ass as? Int)

二、异常

2.1 概念
        异常是程序中发生的运行时问题,导致程序终止。这可能是由于内存空间不足,数组越界,条件除以零而发生的。要在程序执行期间处理这种类型的问题,可使用异常处理技术。 异常处理是一种处理运行时问题并维护程序执行流程的技术。 在Kotlin中,所有异常类都是Throwable类的子类。 要抛出异常对象,Kotlin使用throw表达式。

异常处理中使用了四种不同的关键字。它们是:

try:try块包含可能生成异常的语句集。必须后跟catch 或 finally或两者。

catch:catch块用于捕获try块抛出的异常。

finally:finally块始终执行是否处理异常。所以它用于执行重要的代码语句。

throw:throw关键字用于显式抛出异常。

Kotlin的异常处理和Java类似。
 

未经检查的异常

                未经检查的异常是由于代码中的错误而引发的异常。此异常类型扩展了RuntimeException类。在运行时检查未经检查的异常。 以下是未经检查的异常的一些示例:

ArithmeticException :当将数字除以零时抛出。

ArrayIndexOutOfBoundExceptions:尝试使用不正确的索引值访问数组时抛出。

SecurityException:由安全管理器抛出以指示安全性违规。

NullPointerException:在null对象上调用方法或属性时抛出。

注意:Kotlin不支持已检查异常。
 

2.2 try...catch块

        try-catch块用于代码中的异常处理。 try块包含可能抛出异常的代码,catch块用于处理异常,必须在方法中写入此块。try块必须跟随catch块或finally块或两者。

2.2.1 使用catch块的try语法

 
  1.  
        println("\n------------- tyr{}catch{} 抛出空指针异常  -----------------------------")
        var  exceps:String?=null
        try {
            exceps!!.plus("is good") //抛出异常
        }catch (e:NullPointerException){
            println(e.message+"  NullPointerException异常")
        }

2.2.3 try catch语法与finally块  先finally 后catch

    var name: String? = null
    try {
        name!!.plus("is good")//报错:NullPointerException
    } catch (e: NullPointerException) {
        println(e.message)
    } finally {
        println("都结束了")
    }

2.4 throw关键字

        throw关键字用于抛出显式异常。它用于抛出自定义异常。要抛出异常对象,将使用throw-expression。

fun main() {
    try {
        //第三步:使用
        checkData(name)
        name!!.plus("is good")//报错:NullPointerException
    } catch (e: Exception) {
        println(e.message)
    }
}
//第二步:传入可空String
fun checkData(str:String?){
    //当str为空时,执行ScException()
    str?:throw ScException()
}
//第一步:自定义异常
class ScException():IllegalArgumentException("帅次牌异常")

2.5 先决条件
        Kotlin中提供一些遍历的内置函数,使用这些函数可以自定义信息的异常,这些函数就是先决条件函数。可以用该种函数自定义先决条件,当满足条件时代码才会执行。

函数    描述
checkNotNull    如果参数为null,则抛出IllegalArgumentException异常,否则返回非空值
require    如果参数为false,则抛出IllegalArgumentException异常
requireNotNull    如果参数为null,则抛出IllegalArgumentException异常,否则返回非空值
error    如果参数为null,则抛出IllegalArgumentException异常并输出错误信息,否则返回非空值
assert    如果参数为false,则抛出AssertError异常,并打上断言编译器标记

    try {
        //第三步:使用
        checkData(name)
        name!!.plus("is good")//报错:NullPointerException
    } catch (e: Exception) {
        println(e.message)
    }
}
//第二步:传入可空String
fun checkData(str:String?){
    //当str为空时,执行lambda表达式
    checkNotNull(str,{"帅次牌先决条件异常"})
}

【Kotlin 初学者】空安全与异常_帅次的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值