0


Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家
👉点击跳转到教程

一、Kotlin的可空性

null 在java中我们司空见惯的空指针异常NullPointerException,带给了我们很多麻烦。
Kotlin作为更强大的语言,势必会基于以往的语言设计经验对其进行改良。Kotlin更多
地把运行时可能会出现的null问题,以编译时错误的方式,提前在编译期强迫我们重视起来,
而不是等到运行时报错,防范于未然,提高了我们的程序的健壮性。

二、Kotlin中的安全调用操作符,非空断言操作符,空合并操作符的详解,代码中已经给出详细注释

  1. fun main(){
  2. /**
  3. * 可空性:?
  4. * 对于null值问题,Kotlin反其道而行之,除非另有规定,变量不可为null值,这样一来,
  5. * 运行时崩溃问题从根源上得到解决。
  6. *
  7. * Kotlin的null类型:
  8. * 为了避免NullPointerException,Kotlin的做法是不让我们给非空类型变量赋null值,
  9. * 但null在Kotlin中依然存在。
  10. */
  11. var str: String? ="butterfly"
  12. str = null
  13. println(str)
  14. /**
  15. * null安全:
  16. * 1.Kotlin区分可空类型和非可空类型,所以,你要一个可空类型变量运行,而它又可能
  17. * 不存在,对于这种潜在危险,编译器时刻警惕着。为了应对这种风险,Kotlin不允许你在
  18. * 可空类型值上调用函数,除非你主动接收安全管理。
  19. */
  20. /**
  21. * 选项一: 安全调用操作符:?.
  22. * 这次Kotlin不报错了,编译器看到有安全调用操作符,所以它知道如何检查null值。如果
  23. * 遇到null值,它就跳过函数调用,而不是返回null。
  24. */
  25. println(str?.capitalize())
  26. str ="butterfly"
  27. str = str?.let {
  28. //非空白的字符串
  29. if(it.isNotBlank()){
  30. it.capitalize()}else{"butterfly test"}}
  31. println(str)
  32. /**
  33. * 选项二:使用非空断言操作符:
  34. * 1.!!.又称感叹号操作符,当变量值为null时,会抛出KotlinNullPointerException
  35. */
  36. // str = null
  37. // println(str!!.capitalize())
  38. /**
  39. * 选项三:使用if判断null值情况
  40. * 我们可以使用if判断,但是相比之下安全调用操作符用起来更灵活,代码也更简洁,我们
  41. * 可以用安全操作符进行多个函数的链式调用。
  42. */
  43. if(str != null){
  44. str.capitalize()}else{
  45. println("str 是空的")}
  46. str = str?.capitalize()?.plus(" is great.")
  47. println(str)
  48. /**
  49. * 使用空合并操作符
  50. * ?:操作符的意思是,如果左边的求值结果为null,就使用右边的结果值
  51. */
  52. str = null
  53. println(str ?: "str is null")
  54. /**
  55. * 空合并操作符也可以和let函数一起使用来代替if/else语句
  56. */
  57. str = null
  58. str = str?.let {
  59. it.capitalize()} ?: "butterfly"
  60. println(str)}

输出结果如下:

  1. null
  2. null
  3. Butterfly
  4. Butterfly is great.
  5. str is null
  6. butterfly

三、异常处理和自定义异常,先决条件函数

  1. fun main(){
  2. var number: Int? = null
  3. try {
  4. checkOperation(number)
  5. number!!.plus(1)} catch (e: Exception){
  6. println(e)}}
  7. fun checkOperation(number: Int?){
  8. // number ?: throw UnSkilledException()
  9. /**
  10. * 先决条件函数
  11. * Kotlin标准库提供了一些便利函数,使用这些内置函数,你可以抛出带自定义
  12. * 信息的异常,这些便利函数叫做先决条件函数,你可以用它定义先决条件,条件必须满足
  13. * 目标代码才能执行。
  14. */
  15. checkNotNull(number){"Something is not good"}}
  16. /**
  17. * 自定义异常
  18. * IllegalArgumentException 有一个是java.lang包下的
  19. * 另外一个是kotlin下面的,kotlin下面的其实只是一个别名等于java.lang包下的
  20. * @SinceKotlin("1.1") public actual typealias IllegalArgumentException = java.lang.IllegalArgumentException
  21. */
  22. class UnSkilledException(): IllegalArgumentException("操作不当")

输出结果如下:

  1. java.lang.IllegalStateException: Something is not good

先决条件函数有如下:

在这里插入图片描述
四、substring、split、replace,字符串遍历方法的使用

  1. const val NAME ="I like Android development"
  2. const val WORK ="I,like,Android,development"
  3. fun main(){
  4. /**
  5. * substring
  6. * 字符串截取,substring函数支持IntRange类型(表示一个整数范围的类型)的参数,
  7. * util创建的范围不包括上限值
  8. */
  9. val substring = NAME.substring(7, 14)
  10. var str = NAME.substring(7until14)
  11. println(substring)
  12. println(str)
  13. /**
  14. * split
  15. * split函数返回的是list集合数据,List集合数据又支持解构语法特性,它允许你
  16. * 在一个表达式里给多个变量赋值,解构常用来简化变量的赋值。
  17. */
  18. val data = WORK.split(",")
  19. //data[0] 取集合中的元素
  20. /**
  21. * 这就是解构语法
  22. */
  23. val (origin, dest, proxy, detail)= WORK.split(",")
  24. println("$origin$dest$proxy$detail")
  25. val text ="The people's Republic of China"
  26. val text2 = text.replace(Regex("[aeiou]")){
  27. when (it.value){"a" ->"8""e" ->"6""i" ->"9""o" ->"1""u" ->"3"else -> it.value
  28. }}
  29. println(text)
  30. println(text2)
  31. /**
  32. * 遍历字符串
  33. */
  34. "The people's Republic of China".forEach {
  35. print("$it *")}}

输出结果如下:

  1. Android
  2. Android
  3. I like Android development
  4. The people's Republic of China
  5. Th6 p61pl6's R6p3bl9c 1f Ch9n8
  6. T *h *e * *p *e *o *p *l *e *' *s * *R *e *p *u *b *l *i *c * *o *f * *C *h *i *n *a *

五、- = =与===的比较

  1. fun main(){
  2. /**
  3. * 字符串比较
  4. * 在kotlin中,用==检查两个字符串的字符是否匹配,用===检查两个变量是否
  5. * 指向内存堆上同一对象,而java中==做引用比较,做内容比较时用equals方法
  6. */
  7. val str1 ="Jason"
  8. val str2 ="jason".capitalize()
  9. println(str1 == str2) //true
  10. println(str1 === str2) //false
  11. }

六、数字类型的安全转换函数,Double转Int类型、以及格式化

  1. fun main(){
  2. /**
  3. * 数字类型
  4. * 和java一样,Kotlin中所有数字类型都是有符号的,也就是说既可以表示正数,也可以表示负数
  5. *
  6. */
  7. /**
  8. * 数字格式异常 NumberFormatException
  9. */
  10. // val number1: Int ="8.98".toInt()
  11. /**
  12. * 安全转换函数
  13. * Kotlin提供了toDoubleOrNull和toIntOrNull这样的安全转换函数,如果数值
  14. * 不能正确转换,与其触发异常不如干脆返回null值
  15. */
  16. val number: Int? ="8.9".toIntOrNull()
  17. println(number)
  18. val number2: Double? ="0.91".toDoubleOrNull()
  19. println(number2)
  20. val number3: Double? ="1.99".toDouble()
  21. println(number3)
  22. /**
  23. * Double转Int
  24. * 四舍五入
  25. */
  26. println(8.99.roundToInt())
  27. println(8.49.roundToInt())
  28. /**
  29. * Double转Int
  30. * toInt:精度损失
  31. */
  32. println(8.956.toInt())
  33. /**
  34. * 格式化字符串是一串特殊字符,它决定该如何格式化数据
  35. */
  36. val str ="%.2f".format(8.956)
  37. println(str)}

输出结果如下:

  1. null
  2. 0.911.999888.96
标签: kotlin android java

本文转载自: https://blog.csdn.net/lu202032/article/details/128753962
版权归原作者 路宇 所有, 如有侵权,请联系我们删除。

“Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解”的评论:

还没有评论