美文网首页
kotlin-异常处理

kotlin-异常处理

作者: Method | 来源:发表于2021-10-26 17:50 被阅读0次

    异常是什么

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

    异常分类

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

    相关文章

      网友评论

          本文标题:kotlin-异常处理

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