kotlin-异常处理

异常是什么

异常就是有异于常态,和正常情况不一样,有错误出现。

异常分类

异常分类.png

Error

是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。

代表异常:VirtualMachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)、OutOfMemoryError。

此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。

Exception

程序本身可以捕获并且可以处理的异常。又分为不受检异常、受检异常

  • 运行时异常(不受检异常):

RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常。

代表异常:NullPointerException)、ArrayIndexOutBoundException。

此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

  • 非运行时异常(受检异常):

Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常
代表异常:说IOException

必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。

异常的处理

抛出异常:throw,throws

throw

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结 束当前方法的执行。

public class DemoThrow {
    public static void main(String[] args) {
      int a =   DemoThrow.div(4,0);
      System.out.println(a);
    }
 
   public static int div(int a,int b)
      {
            if(b==0)
              throw new ArithmeticException("异常信息:除数不能为0");//抛出具体问题,编译时不检测
            return a/b;
     }
}
e1.png

throws

运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
 
public class DemoThrows {
 
 
    public static void main(String[] args) throws FileNotFoundException{
        readFile();
    }
 
    public static  void readFile() throws FileNotFoundException {
        InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
    }
}
e2.png

try代码块

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
 
public class DemoTryCatch {
 
    public static void main(String[] args) {
        //捕获异常
        try {
            //可能产生异常的代码
            readFile();
        } catch (FileNotFoundException e) {
            //异常的处理逻辑,将异常记录日志,异常封装后显示
          System.out.println("系统找不到指定的路径");
        }
        System.out.println("后续代码");
 
    }
    public static  void readFile() throws FileNotFoundException {
        InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
    }
}
e3.png

kotlin异常处理

Kotlin 中所有异常类都是 Throwable 类的子类。

throw

fun main() {
//sampleStart
    throw Exception("Hi There!")
//sampleEnd
}

try

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

try表达式

fun e3(){
    val result = try {
        throw IllegalArgumentException("exception happen")
    }catch (e:Throwable){
        println(e.message)
        0   //返回最后一行
    }finally {
        123 //不会作为返回值,只会返回try、catch最后一行
    }
    println(result)
}

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

受检的异常

Kotlin 没有受检的异常。可以理解都是运行时异常。同理AS不会提醒你要捕捉异常。

Java

try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

kotlin

Thread.sleep(3000)

经过了解知道,不仅仅Thread.sleep不需要获取异常,像对文件操作一般需要捕获的IOException也不需要了;

原来kotlin在编译时根本不会检查你有没有捕获异常!
看到这里我也是有点担心的,不捕获异常万一在运行时抛出异常程序不就崩了吗?

其实很多异常我们是可以预估到它可能会发生并且避免的,比如Thread.sleep的InterruptedException,只有在调用thrad.interrupt()方法后才会抛出,正常情况下并不会抛出该异常,但是在java中编译器却强制我们要捕获,让代码看起来就很臃肿不够简洁;

而且 java强制要求捕获异常并没有降低异常的发生,有很多更常见的异常并没有强制要求捕获,例如:NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException等

kotlin并不是告诉你不要再捕捉异常!对待异常,我们还是要养成良好的编码习惯,考虑周全一些,在可能抛出异常的地方通过if判断等方式将其扼杀在摇篮里;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容