Kotlin的枚举与异常示例详解
一、kotlin中枚举的定义
枚举需要用到两个关键字enumclass,譬如这样
enumclassColor(valr:Int,valg:Int,valb:Int){ //彩虹色也是一个典故:韦克菲尔德战役 RED(255,0,0),ORANGE(255,165,0),YELLOW(255,255,0), GREEN(0,255,0),BLUE(0,0,255),INDIGO(75,0,130),VIOLET(238,130,238); funrgb()=(r*255+g)*256+b }
调用枚举中的rgb函数
funmain(){ println("RED'sRGBvalueis${Color.RED.rgb()}")
二、枚举和when的结合
初步使用
//枚举和when的配合使用 fungetMnemonic(color:Color):String{ //when配合枚举使用 returnwhen(color){ Color.RED->"Richard" Color.ORANGE->"Of" Color.YELLOW->"York" Color.GREEN->"Gave" Color.BLUE->"Battle" Color.INDIGO->"In" Color.VIOLET->"Vain!" } }
如果多个case的结果是一样的,可以通过逗号连接,譬如
//when的多个case同一个结果的方式 fungetWarmth(color:Color)=when(color){ Color.RED,Color.ORANGE,Color.YELLOW->"warm" Color.GREEN->"neutral" Color.BLUE,Color.INDIGO,Color.VIOLET->"cold" }
遇到有case之外其他情况,使用else。用when代替if
funmix(c1:Color,c2:Color)= when(setOf(c1,c2)){ setOf(Color.RED,Color.YELLOW)->Color.ORANGE else->throwException("DirtyColor") }
使用不带参数的when
funmixOptimized(c1:Color,c2:Color)= when{ (c1==Color.RED&&c2==Color.YELLOW|| c2==Color.RED&&c1==Color.YELLOW)->Color.ORANGE else->throwException("DirtyColor") }
setOf是将元素加入到Set集合中
when中可通过is判断类型
funeval(e:Expr):Int= when(e){ isNum->e.value isSum->eval(e.right)+eval(e.left) else->throwIllegalArgumentException("Unknownexpression") }
when中使用in检查范围
funrecognize(c:Char)=when(c){ in'0'..'9'->"It'sadigit!" in'a'..'z',in'A'..'Z'->"It'saletter" else->"Idon'tknowwhatitis." }
三、Kotlin中的异常
kotlin中不区分受检异常和
Java中的异常:受检异常,这种异常必须显式的处理
Kotlin中的异常:不区分受检异常和未受检异常。不用指定函数抛出的异常,而且可以处理也可以不处理异常。
受检异常有个弊端就是:很多时候的异常我们是不需要捕捉的,因为捕捉了也没法处理。
比如BufferReader.close可能会抛出IOException异常,但很多程序对这个异常都不会采取有意义的行动,所以对这个异常的捕获所写的代码就是冗余的代码
当然,它的使用和Java基本一样,try-catch或try-catch-finally块
//将读取到的字符串类型转化成Int类型 funreadNumber(reader:BufferedReader):Int?{ try{ valline=reader.readLine() returnInteger.parseInt(line) }catch(e:NumberFormatException){ returnnull }finally{ reader.close() } }
其实Kotin中的try关键字也是表达式,所以也可以这么写:
funreadNumber2(reader:BufferedReader){ valnumber=try{ valline=reader.readLine() Integer.parseInt(line) }catch(e:NumberFormatException){ return } println(number) }
总结
学习Kotlin不仅仅是在学习一种新语言,更是在学习改变习惯思考方式的过程
和Java对比,用Kotin给你带来不一样的思考习惯
- 熟悉的if现在是带返回值的表达式
- when表达式类似于Java中的switch但功能更强大
- for循环在kotlin中更加方便,尤其是迭代map和迭代集合需要下标的时候
- Kotlin中通过==..==就可以创建一个区间。区间和数列允许在for循环中使用统一的语法和同一套抽象机制,并且还可以使用==in==和==!in==来检查值是否属于某个区间。
- Kotlin不区分受检异常和不受检异常。抛弃Java中的毫无意义的重新抛出和忽略异常的代码。中