Kotlin 进阶之路6 异常错误处理和类型检查
1、异常错误处理
/** * 对可能发生执行异常的代码的一种保护 * 默认异常类:Exception * */ fun main(args: Array<String>) { println("--------------直接展示错误--------------") //直接展示错误 try{ "abc".toInt() }catch (e:Exception){ println(e) } println("--------------忽略错误--------------") //忽略错误 val a : Int ? = try { "abc".toInt() }catch (e: Exception){ null } println(a) } 复制代码
整数: -1 0 e是安全转换后的c ,值是null 复制代码
2、类型检查与转换
空类型
任意类型都有可空和不可空两种
- val notNull:String = null //错误,不能为空 - val nullable:String? = null //正确,可以为空 - notNull.length //正确,不为空的值可以直接使用 - nullable.length //错误,可能为空,不能直接获取长度 - nullable!!.length //正确,强制认定nullable不可空 - nullable?.length //正确,若nullable为空,返回空 复制代码
fun getName(): String? { return "张三" } fun getName2(): String? { return null } fun main(args: Array<String>) { val name = getName() ?: return println("姓名1:$name") val value: String? = "Hello World" //不用检查是否为空 println(value!!.length) val name2 = getName2() ?: return println("姓名2:$name2") } 复制代码
姓名1:张三 11 复制代码
智能类型转换
Java Style 类型转换
- val sub:SubClass = parent as SubClass - 类似于Java的类型转换,失败则抛异常 复制代码
安全类型转换
- val sub:SubClass? = parent as? SubClass - 如果转换失败,返回 null ,不抛异常 复制代码
/** * 检查:对一个变量的类型进行转换 * 转换:把变量转成成其他类型使用 */ fun main(args: Array<String>) { val a = 5 val b = 6 val c = if (a > b) "大于" else a - b //类型判断: is if (c is String) { println(c.length) } else { println("整数: $c ") } //Kotlin编译器大多时候能智能转换 if(c is Int) println(c.inc()) /** * 手动转换:强制转换as * 强制转换 会报错java.lang.ClassCastException * */ //val d = c as String //println("d是强制转换后的c ,值是$d ") /** * 手动转换:安全转换as? * 安全转换 */ val e = c as? String println("e是安全转换后的c ,值是$e ") } 复制代码
**
整数: -1 0 e是安全转换后的c ,值是null 复制代码
智能类型转换
- if(parent is SubClass)parent.<子类的成员> - 编译器尽可能的推导类型,远离无用的类型转换 - if(nullable!=null) nullable.length - 正确!因为我们确认nullable 复制代码
public class Parent { public String getName(){ return "parent"; } } 复制代码
public class Child extends Parent{ @Override public String getName() { return "child"; } } 复制代码
fun main(args: Array<String>) { val parent: Parent = Child() if (parent is Child) { println(parent.name) } val value: String? = "Hello World" //因为value!=null 自动为String型 if (value != null) { println(value.length) } } 复制代码
child 11
作者:冬日毛毛雨
链接:https://juejin.cn/post/7026595726591262727