Kotlin的枚举与异常示例详解

一、kotlin中枚举的定义

枚举需要用到两个关键字 enum class,譬如这样

enum class Color(val r: Int,val g: Int,val b: 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);

 fun rgb() = (r * 255 + g) * 256 + b
}

调用枚举中的rgb函数

fun main() {
 println("RED's RGB value is ${Color.RED.rgb()}")

二、枚举和when的结合

初步使用

//枚举和when的配合使用
fun getMnemonic(color: Color): String{

 //when配合枚举使用
 return when(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同一个结果的方式
fun getWarmth(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

fun mix(c1: Color,c2: Color) =
 when(setOf(c1,c2)){
  setOf(Color.RED,Color.YELLOW) -> Color.ORANGE
  else -> throw Exception("Dirty Color")
 }

使用不带参数的when

fun mixOptimized(c1: Color,c2: Color) =
  when{
   (c1 == Color.RED&& c2 == Color.YELLOW ||
     c2 == Color.RED&& c1 == Color.YELLOW) -> Color.ORANGE
   else -> throw Exception("Dirty Color")
  }

setOf是将元素加入到Set集合中

when中可通过is判断类型

fun eval(e: Expr): Int =
  when(e){
   is Num -> e.value
   is Sum -> eval(e.right) + eval(e.left)
   else -> throw IllegalArgumentException("Unknown expression")
  }

when中使用in检查范围

fun recognize(c: Char) = when(c){
 in '0'..'9' -> "It's a digit!"
 in 'a'..'z',in 'A'..'Z' -> "It's a letter"
 else -> "I don't know what it is."
}

三、Kotlin中的异常

kotlin中不区分受检异常和

Java中的异常: 受检异常,这种异常必须显式的处理
Kotlin中的异常:不区分受检异常和未受检异常。不用指定函数抛出的异常,而且可以处理也可以不处理异常。

受检异常有个弊端就是:很多时候的异常我们是不需要捕捉的,因为捕捉了也没法处理。

比如BufferReader.close可能会抛出IOException异常,但很多程序对这个异常都不会采取有意义的行动,所以对这个异常的捕获所写的代码就是冗余的代码

当然,它的使用和Java基本一样,try-catch或try-catch-finally块

//将读取到的字符串类型转化成Int类型
fun readNumber(reader: BufferedReader): Int?{
  try {
   val line = reader.readLine()
   return Integer.parseInt(line)
  }catch (e: NumberFormatException){
   return null
  }finally {
   reader.close()
  }
}

其实Kotin中的try关键字也是表达式,所以也可以这么写:

fun readNumber2(reader: BufferedReader){
 val number = try {
  val line = 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中的毫无意义的重新抛出和忽略异常的代码。中

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • SpringBoot2.X Kotlin系列之数据校验和异常处理详解

    在开发项目时,我们经常需要在前后端都校验用户提交的数据,判断提交的数据是否符合我们的标准,包括字符串长度,是否为数字,或者是否为手机号码等:这样做的目的主要是为了减少SQL注入攻击的风险以及脏数据的插入.提到数据校验我们通常还会提到异常处理,因为为了安全起见,后端出现的异常我们通常不希望直接抛到客户端,而是经过我们的处理之后再返回给客户端,这样做主要是提升系统安全性,另外就是给予用户友好的提示. 定义实体并加上校验注解 class StudentForm() { @NotBank(message

  • Kotlin 基础教程之异常

    Kotlin 基础教程之异常 概述 在Kotlin-null的处理里提到的NPE,它就是一个异常.而,异常是程序运行过程中出现的错误.在Kotlin中,所有的异常都继承于Throwable.对于每一个异常而言,它不仅仅包括异常的信息,还可以选择性包括异常的原因,而其原因也是一个异常的实例. 抛出异常 使用 throw表达式抛出异常: throw MyException("Hi There!") 捕获异常 如果在函数内部抛出了异常(或者在函数内部调用的其他函数抛出了异常),这个函数将在抛

  • 利用Kotlin的方式如何处理网络异常详解

    一. 前言 之前的文章 RxJava处理业务异常的几种方式 曾经介绍过 Retrofit 的异常可以有多种处理方式. 其中,可以使用 RxJava 的错误处理操作符,它们是专门用来处理异常的. 随便例举两个操作符: onErrorReturn 操作符,表示当发生错误的时候,发射一个默认值然后结束数据流.所以 Subscriber 看不到异常信息,看到的是正常的数据流结束状态. onErrorResumeNext 操作符,表示当错误发生的时候,使用另外一个数据流继续发射数据.在返回的被观察者中是看

  • Kotlin基础学习之循环和异常

    前言 Kotlin并没有想象中的那么牛逼哄哄,也并不难,我更喜欢把他看做一枚语法糖,所谓的语法糖就是:能够让代码变得更加简单易读的辅助工具.而工具这种东西,看看说明书,实操几遍基本就能掌握,都是记忆性的东西,熟能生巧.如果你的Java基础扎实,看看Kotlin的开发文档,写写Demo,分分钟就上手了. 说到这个Kotlin提升写代码效率,还是谈谈几个最直观简单的例子吧: 1.不用再去 findViewById 或者 @BindView,拿到控件id直接用 2.不用再为 Bean 写一堆 gett

  • Kotlin的枚举与异常示例详解

    一.kotlin中枚举的定义 枚举需要用到两个关键字 enum class,譬如这样 enum class Color(val r: Int,val g: Int,val b: 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); fun rgb() = (r * 2

  • Kotlin协程Dispatchers原理示例详解

    目录 前置知识 demo startCoroutineCancellable intercepted()函数 DefaultScheduler中找dispatch函数 Runnable传入 Worker线程执行逻辑 小结 前置知识 Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中.所以从本质上讲,Kotlin和Java是类似的,都是可以编译产生class的语言,但最终还是会受到虚拟机的限制,它们的代码最终会在虚拟机上的某个线程上被执行. 之

  • 图解 Kotlin SharedFlow 缓存系统及示例详解

    目录 前言 replay extraBufferCapacity onBufferOverflow SharedFlow Buffer 前言 Kotlin 为我们提供了两种创建“热流”的工具:StateFlow 和 SharedFlow.StateFlow 经常被用来替代 LiveData 充当架构组件使用,所以大家相对熟悉.其实 StateFlow 只是 SharedFlow 的一种特化形式,SharedFlow 的功能更强大.使用场景更多,这得益于其自带的缓存系统,本文用图解的方式,带大家更

  • kotlin android extensions 插件实现示例详解

    目录 前言 原理浅析 总体结构 源码分析 插件入口 配置编译器插件传参 编译器插件接收参数 注册各种Extension IrGenerationExtension ExpressionCodegenExtension StorageComponentContainerContributor ClassBuilderInterceptorExtension PackageFragmentProviderExtension 总结 前言 kotlin-android-extensions 插件是 Ko

  • iOS中捕获日志与异常示例详解

    前言 在平时自己调试的时候,可以直接连接电脑,直接在窗口中查看结果.但是在测试人员测试,或者灰度测试的时候,怎么才能拿到日志呢?最先想到的肯定是输出到本地文件,然后在需要的时候进行上传. 分享一段之前找到的方法,下面的代码提供了两个主要功能: – 把日志输出到文件中 – 捕捉异常信息 [解析都写在注释中了] 示例代码 - (void)redirectNSLogToDocumentFolder { //如果已经连接Xcode调试则不输出到文件 //该函数用于检测输出 (STDOUT_FILENO)

  • Nodejs监控事件循环异常示例详解

    开场白 最近在学习 libuv,也了解了一些 Node.js 中使用 libuv 的例子.当然,这篇文章不会去介绍 event loop,毕竟这些东西在各个论坛.技术圈里都被介绍烂了.本文介绍如何正确使用 Event loop,以及即使发现程序是否异常 block. 基础 event loop 的基础想必各位读者都比较熟悉了.这里我引用官方的图,简单介绍两句,作为前置准备: event loop是作为单线程实现异步的方式之一.简而言之,就是在一个大的 while 循环中不断遍历这些 phase,

  • Kotlin对象比较注意点示例详解

    目录 背景 原因 另一个问题 解决办法 结论 背景 现有一个StateFlow及其监听 private val stateFlow = MutableStateFlow(kotlin.Pair<String, ArrayList<String>>("abc", ArrayList())) GlobalScope.launch { stateFlow.collect { // do something } } 更新ArrayList并尝试emit GlobalSc

  • Kotlin协程的基础与使用示例详解

    目录 一.协程概述 1.概念 2.特点 3.原理 1)续体传递 2)状态机 二.协程基础 1.协程的上下文 2.协程的作用域 3.协程调度器 4.协程的启动模式 5.协程的生命周期 1)协程状态的转换 2)状态标识的变化 三.协程使用 1.协程的启动 1)runBlocking方法 2)launch方法 3)async方法 4)suspend关键字 5)withContext方法 6)suspend方法 2.协程间通信 1)Channel 2)Channel的容量 3)produce方法与act

  • Java中枚举类的用法示例详解

    目录 1.引入枚举类 2.实现枚举类 3.枚举类的使用注意事项 4.枚举的常用方法 5.enum细节 1.引入枚举类 Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割. 示例: enum Color { RED, GREEN, BLUE; } 2.实现枚举类 接下来我们来看一个一个简单的DEMO示例: /** * java枚举 */ p

  • Kotlin编程条件控制示例详解

    目录 本文总览 1. When 表达式 2. If 表达式 总结 本文总览 本篇来看看 Kotlin的条件控制,这一节知识点 建议与Java中的条件结构类比,会很好理解并记住. 1. When 表达式 在 Kotlin 用 when 来定义多个分支的条件表达式.Kotlin中这个语法与 java 中的 switch 语句非常类似.代码块的执行就是将参数与所有的分⽀条件顺序⽐较,直到满⾜某个分⽀条件:(示例 ) when (x) { 1 -> print("x == 1") 2 -

随机推荐