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语法
-
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,{"帅次牌先决条件异常"})
}