kotlin-异常处理

2021-10-26  本文已影响0人  Method

异常是什么

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

异常分类

异常分类.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判断等方式将其扼杀在摇篮里;

上一篇下一篇

猜你喜欢

热点阅读