异常类

  Kotlin 中所有异常类都是 Throwable 类的子孙类。每个异常都有消息、堆栈回溯信息以及可选的原因

  使用 throw-表达式来抛出异常

throw Exception("Hi There!")

  使用 try-表达式来捕获异常:

try {
// 一些代码
}
catch (e: SomeException) {
// 处理程序
}
finally {
// 可选的 finally 块
}

  可以有零到多个 catch 块。finally 块可以省略。但是 catch 与 finally 块至少应该存在一个

Try 是一个表达式

  try 是一个表达式,即它可以有一个返回值

val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }

  try-表达式的返回值是 try 块中的最后一个表达式或者是(所有)catch 块中的最后一个表达式。finally块中的内容不会影响表达式的结果

受检的异常

  Kotlin 没有受检的异常。这其中有很多原因,但我们会提供一个简单的例子。

  以下是 JDK 中 StringBuilder 类实现的一个示例接口

Appendable append(CharSequence csq) throws IOException

  这个签名是什么意思?它是说,每次我追加一个字符串到一些东西(一个 StringBuilder、某种日志、一个控 制台等)上时我就必须捕获那些 IOException 。为什么?因为它可能正在执行 IO 操作( Writer 也实现了Appendable )...... 所以它导致这种代码随处可⻅的出现

try {
log.append(message)
}
catch (IOException e) {
// 必须要安全
}

  

Nothing 类型

  在 Kotlin 中 throw 是表达式,所以你可以使用它(比如)作为 Elvis 表达式的一部分:

val s = person.name ?: throw IllegalArgumentException("Name required")

  throw 表达式的类型是特殊类型 Nothing。该类型没有值,而是用于标记永远不能达到的代码位置。在你自己的代码中,你可以使用 Nothing 来标记一个永远不会返回的函数

fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}

  当你调用该函数时,编译器会知道在该调用后就不再继续执行了

 val s = person.name ?: fail("Name required")
println(s) // 在此已知“s”已初始化

  可能会遇到这个类型的另一种情况是类型推断。这个类型的可空变体 Nothing? 有一个可能的值是 null 。 如果用 null 来初始化一个要推断类型的值,而又没有其他信息可用于确定更具体的类型时,编译器会推断出Nothing? 类型

val x = null // “x”具有类型 `Nothing?`
val l = listOf(null) // “l”具有类型 `List<Nothing?>

  

kotlin更多语言结构——>异常的更多相关文章

  1. 06. Go 语言结构体

    Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...

  2. KOTLIN开发语言文档(官方文档) -- 2.基本概念

    网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2.   基本概念 2.1.  基本类型 从可以在任何变量处理调用成员函数和属性 ...

  3. Java 语言结构【转】

    Java 语言结构 基础:包(Package).类(Class)和对象(Object) 了解 Java 的包(Package).类(Class)和对象(Object)这些基础术语是非常重要的,这部分内 ...

  4. KOTLIN开发语言文档(官方文档) -- 入门

    网页链接:https://kotlinlang.org/docs/reference/basic-syntax.html 1.   入门 1.1.  基本语法 1.1.1.   定义包 包说明应该在源 ...

  5. 漫谈C语言结构体struct、公用体union空间占用

    先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...

  6. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  7. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  8. (转)PHP的语言结构和函数的区别

    相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等. 例子: if ( isset($user) ) { //do some thi ...

  9. php入门 数据类型 运算符 语言结构语句 函数 类与面向对象

    php PHP-enabled web pages are treated just like regular HTML pages and you can create and edit them ...

  10. Go语言结构体(struct)

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

随机推荐

  1. 【Vue2】Direct 指令

    1.内容渲染指令 1.插值表达式 2.V - TEXT 3.V - HTML <!DOCTYPE html> <html lang="en"> <he ...

  2. 【SqlServer】02 SSMS工具基本使用入门

    之前的安装中除了SqlServer,还有一个SSMS管理工具 数据库的访问依赖于工具 SSMS提供了两种登陆方式: 创建用户: 删除用户: 创建数据库: 删除数据库: 创建表: 设置表的字段,字段名称 ...

  3. jmeter 使用非 GUI 模式运行测试脚本

    使用非 GUI 模式运行测试脚本时可以使用的一些命令:-h 帮助 -> 打印出有用的信息并退出-n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter-t 测试文件 -> ...

  4. 【转载】 【树莓派】为Ubuntu Mate for ARM 更换中国软件源

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/wr132/article/details ...

  5. 带有最小间隔时间的队列读取实现 —— 最小等待时间的队列 —— Python编程(续)

    接前文: 带有最小间隔时间的队列读取实现 -- 最小等待时间的队列 -- Python编程 由于上次的设计多少有些简单,这里对此丰富一下. ============================== ...

  6. baselines算法库baselines/common/input.py模块分析

    baselines算法库baselines/common/input.py模块代码: import numpy as np import tensorflow as tf from gym.space ...

  7. 部署CPU与GPU通用的tensorflow:Anaconda环境

      本文介绍在Anaconda环境中,下载并配置Python中机器学习.深度学习常用的新版tensorflow库的方法.   在之前的两篇文章Python TensorFlow深度学习回归代码:DNN ...

  8. uniapp苹果开发用什么截屏

    uniapp开发好苹果的app后,需要上架到app store connect后,用户才能使用app store进行安装. 在上架app store的过程中,却要求我们提供多种尺寸的app运行的设备截 ...

  9. BossPlayersCTF靶机笔记

    BossPlayersCTF靶机 靶机概述 这是vulnhub上的一个简单的linux靶机,适合初级渗透测试人员,同时也告诉我们在渗透测试过程中要有耐心,要允许有兔子洞. 靶机整体思路: 主机端口探测 ...

  10. 使用Django-Channels实现websocket通信+大模型对话

    前言 最近一直在做这个大模型项目,我选了 Django 作为框架(现在很多大模型应用都用的 FastAPI,不过我已经用习惯 Django 了) 之前使用 AspNetCore 作为后端的时候,我先后 ...