阅读 70

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


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐