Kotlin 基础教程之异常

 更新时间:2017年06月05日 10:58:06   作者:行云间  
这篇文章主要介绍了Kotlin 基础教程之异常的相关资料,需要的朋友可以参考下

Kotlin 基础教程之异常

概述

在Kotlin-null的处理里提到的NPE,它就是一个异常。而,异常是程序运行过程中出现的错误。在Kotlin中,所有的异常都继承于Throwable。对于每一个异常而言,它不仅仅包括异常的信息,还可以选择性包括异常的原因,而其原因也是一个异常的实例。

抛出异常

使用 throw表达式抛出异常:

throw MyException("Hi There!")

捕获异常

如果在函数内部抛出了异常(或者在函数内部调用的其他函数抛出了异常),这个函数将在抛出异常的地方结束。如果不希望函数结束,此时就必须捕获这个被抛出的异常并处理这个异常。

在Kotlin中,要捕获异常, 可以使用 try 表达式:

try {
  // 某些代码
}
catch (e: SomeException) {
  // 异常处理
}
finally {
  // 可选的 finally 代码段
}
  1. try语句块:表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。
  2. catch语句块:会捕获try代码块中发生的异常并在其代码块中做异常处理,catch语句带一个Throwable类型的参数,表示可捕获异常类型。当try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配, 若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对象。catch语句可以有多个, 用来匹配多个中的一个异常,一旦匹上配后,就不再尝试匹配别的catch块了。 通过异常对象可以获取异常发生时完整的JVM堆栈信息,以及异常信息和异常发生的原因等。
  3. finally语句块:紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,而不管是否try语句块是否发生异常。并且这个语句块总是在方法返回前执行。 目的是给程序一个补救的机会。这样做也体现了Java语言的健壮性。

注:

  1. try、catch、finally三个语句块均不能单独使用,三者可以组成 try…catch…finally、try…catch、try…finally三种结构,catch语句可以有一个或多个,finally语句最多一个。
  2. try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
  3. 多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下。
  4. try表达式中可以有0个或多个catch代码段. finally 代码段可以省略. 但是,catch或 finally代码段至少要出现一个与try配对出现。

自定义异常

在Kotlin标准库中封装的异常类型,不可能会预见所有的可能碰见的异常情况,此时自己定义异常,来表示程序中可能出现的特定问题。

如果想自定义异常,就必须继承现有的异常类,一般都继承其异常情况相似的类,建立异常类型最简单的方法就是使用编辑器产生默认的构造方法,这样简单而有效。

fun main(args: Array<String>) {

  var b: String? = null

  try {
    b?.length ?: throw MyExcepttion("b不能为空")
  } catch (ex: MyExcepttion) {
    println("ex: ${ex.message}")
  } catch (npe: NullPointerException) {
    println("npe: ${npe.message}")
  } finally {
    println("finally")
  }

}

public class MyExcepttion(override val message: String) : Throwable(){

}

// Log
ex: b不能为空
finally

try表达式

在Kotlin中try是一个表达式, 也就是说, 它可以有返回值.

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

try表达式的返回值, 要么是try代码段内最后一个表达式的值,要么是 catch代码段内最后一个表达式的值. finally代码段的内容不会影响 try 表达式的结果值.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Spring Boot项目抵御XSS攻击实战过程

    Spring Boot项目抵御XSS攻击实战过程

    XSS攻击又称跨站脚本攻击,通常指利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序,下面这篇文章主要给大家介绍了关于Spring Boot项目抵御XSS攻击的相关资料,需要的朋友可以参考下
    2022-11-11
  • java使用RSA加密方式实现数据加密解密的代码

    java使用RSA加密方式实现数据加密解密的代码

    这篇文章给大家分享java使用RSA加密方式实现数据加密解密,通过实例代码文字相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下
    2019-11-11
  • java获取http请求的Header和Body的简单方法

    java获取http请求的Header和Body的简单方法

    下面小编就为大家带来一篇java获取http请求的Header和Body的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java Stream中的Spliterator类概念及原理解析

    Java Stream中的Spliterator类概念及原理解析

    Spliterator是Java 8引入的一个接口,位于java.util包中,它结合了迭代器(Iterator)的遍历能力和分割器(Splitter)的分割能力,本文将详细介绍Spliterator的概念、原理、作用、类中定义的关键方法,以及它在Stream API中的实际应用,感兴趣的朋友一起看看吧
    2024-08-08
  • Java 实现多线程的几种方式汇总

    Java 实现多线程的几种方式汇总

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
    2016-03-03
  • Gateway如何实现全局跨域

    Gateway如何实现全局跨域

    这篇文章主要介绍了Gateway如何实现全局跨域问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java获取Process子进程进程ID方法详解

    Java获取Process子进程进程ID方法详解

    这篇文章主要介绍了Java获取Process子进程进程ID方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • SpringBoot整合Mybatis的知识点汇总

    SpringBoot整合Mybatis的知识点汇总

    在本篇文章里小编给各位整理的是关于SpringBoot整合Mybatis的知识点汇总,有兴趣学习的参考下。
    2020-02-02
  • Java IO流对文件File操作

    Java IO流对文件File操作

    这篇文章主要介绍了Java IO流对文件File操作,java封装的一个操作文件及文件夹(目录)的对象。可以操作磁盘上的任何一个文件和文件夹
    2022-12-12
  • Spring中的接口重试机制解析

    Spring中的接口重试机制解析

    这篇文章主要介绍了Spring中的接口重试机制解析,大家在做项目的时候,往往会遇到一些接口由于网络抖动等问题导致接口响应超时等,这时候我们会希望能够按照一定的规则进行接口请求重试,需要的朋友可以参考下
    2024-01-01

最新评论