kotlin 中的异常

作者: shenshizhong | 来源:发表于2017-09-23 21:16 被阅读178次

文章目录

  • 前言
  • kotlin 异常的简介
  • kotlin 异常的使用
  • 总结

前言

java 中的异常只要 try/catch 就可以捕获异常,那么 kotlin 与java 会有什么不同呢,是不是更简单呢,有哪些新的优势呢,下面就讲解一下

kotlin 异常的简介

  • 可以在 catch 返回值
    //下面是kotlin 特有的
  • 可以在 catch 返回 null
  • 可以在 catch 使用 return,跳出方法
  • 不区分受检异常 和 不受检异常
  • try/catch 可以作为一个表达式

异常的使用

1、一般情况,在 catch 返回值(注意对比,java和kotlin的区别)

//java
public class TryCatchAndFinally {
    public static void main(String[] args){
        BufferedReader bufferedReader = new BufferedReader(new StringReader("234"));
        try {
            System.out.println(readNumber(bufferedReader));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static int readNumber(BufferedReader reader) throws IOException {
        try {
            String readLine = reader.readLine();
            return Integer.parseInt(readLine);
        } catch (NumberFormatException e) {
            return -1; //不是数字,返回-1
        }finally {
            reader.close();
            return -1;
        }

    }
}

//kotlin
fun readNumber(reader: BufferedReader): Int? {//返回值可为空
    try {
        return Integer.parseInt(reader.readLine())
    }catch (e: NumberFormatException){
        return null;
    }finally {
        reader.close()
    }
}

fun main(args: Array<String>) {
    val bufferedReader = BufferedReader(StringReader("234"))
    println(bufferedReader)
}

在上面的代码中,还要注意 kotlin 是不区分受检异常 和 不受检异常。
正常情况下,如果是受检异常,那么都要写抛出异常的,就比如
IOException 是受检异常,在 java 中就一定得 throws,但kotlin 可以不用写在编译器也不会报错。

2、在 catch 返回 null 或者直接 return

//kotlin
fun readNumber(reader: BufferedReader): Int? {//返回值可为空
    try {
        return Integer.parseInt(reader.readLine())
    }catch (e: NumberFormatException){
        return null;
       //return       //可以用 return,直接跳出方法
    }finally {
        reader.close()
    }
}

fun main(args: Array<String>) {
    val bufferedReader = BufferedReader(StringReader("234"))
    println(bufferedReader)
}

3、try/catch 可以作为一个表达式

import java.io.BufferedReader
import java.io.StringReader

fun readNumber(reader: BufferedReader){
    val number = try {
        Integer.parseInt(reader.readLine())
    }catch (e: NumberFormatException){
        null
    }
    println(number)
}

fun main(args: Array<String>) {
    val bufferedReader = BufferedReader(StringReader("not a number"))
    readNumber(bufferedReader)
}

上面代码可以看到如果 try 代码块执行正常,那么最后一个表达式就是结果,如果捕获异常,那么 catch 中的最后一个表达式就是结果。

总结

  • kotlin 中的异常写法更简洁
  • kotln 中的异常写法更多样化

如果对你有一点点帮助,那是值得高兴的事。:)
欢迎长按下图 -> 识别图中二维码 或者 扫一扫 关注我的公众号:

shenshizhong.png

我的csdn:http://blog.csdn.net/shenshizhong
我的简书:http://www.jianshu.com/u/345daf0211ad

相关文章

网友评论

  • Xigong:大兄弟,你的第一个例子中,在finally 块中return了,这是一种错误的编程范式,会导致try代码块中的return 语句得不到执行的机会
    shenshizhong:感谢提醒,已更改

本文标题:kotlin 中的异常

本文链接:https://www.haomeiwen.com/subject/vxbtextx.html