android基础-Java篇06:Java异常处理机制

异常处理是Java中唯一整式的错误报告机制,而且是通过编译器强制执行的。

了解异常处理,就一定要了解Throwable类

Throwable类(API文档Throwable):

      在Java中,所有的异常都是最终继承于Throwable类,也就是说Java异常都是对象,是Throwable类的子类(也可以说是Throwable对象,因为Throwable类是异常类型的根类)。

Throwable类有两个子类:

1、Error类(错误):Error是程序无法处理的错误,它们不能被应用程序代码捕获,例如内存溢出、虚拟机自身运行错误,已经超出了应用程序本身能力之外了。

2、Exception类(异常)(API文档:Exception):可恢复异常的所有类的超类。当引发异常时,可能会被应用程序代码捕获,而我们所有异常都继承自这个类。这也是我们主要要介绍的。


异常可以分为:1、检查异常 2、运行异常

1、检查异常:是编译器要求出现此类异常时必须处理的异常,当然这类异常在一定程度上是可以预见。

2、运行异常:是编译器不要求必须处理的异常,也就是当其出现时,可以选择处理或者不处理,尽管不处理的状态下,编译器也一样会编译通过,运行异常都是RuntimeException类及其子类,一般是程序逻辑错误原因引起。如NullPointerException异常(RuntimeException是Exception的子类,在Exception的子类中除了RuntimeException和RuntimeException的子类,其余的都是检查异常)

android基础-Java篇06:Java异常处理机制

异常处理机制

上文介绍时,提到了检查异常出现时时一定要被处理的,那么接下来介绍异常处理机制。

异常处理机制可分为两个过程:抛出异常和捕获异常


抛出异常

      当遇到异常情形的时候,程序的当前环境无法获得必要的信息解决问题,所能做的就是把问题提交给上一级环境。当抛出异常之后,创建异常对象,会在堆上建立异常对象的引用,异常对象携带异常的类型等信息,当前的执行路径被终止,并由异常处理机制来寻找合适的异常处理程序。

 

捕获异常(try-catch)(try-catch-finally)

      当方法内部抛出异常的时候,这个方法如上所说,会在抛出异常的过程中结束,也就是在此方法内部,在抛出异常的语句后面的所有程序将不执行。然而你已经知道这段方法(代码)可能回抛出异常,以及希望尝试解决异常或者做一些其他事情时。那么,可以使用try-catch(try-catch-finally)关键字可以对其监控并捕获异常。

      try{ }中放入可能会抛出异常的代码,在catch(ExceptionType id){ }放入异常处理程序,只要抛出的异常能与ExceptionType匹配,就直接进入catch运行其子句,其匹配的原则是抛出的异常对象属于catch()中的异常类或者其异常类的子类都可以。

try-catch的书写方式和switch-case相识,如下:

    try{

        …

    } catch(Type1 id1){

        …

    } catch(Type2 id2){

        …

    }

    …

    finally{

        …

    }

这里不同的是,switch-case的每个case的后面够跟着一个break,而catch没有,只要和异常类型(Type)匹配,就直接进入catch运行其子句,一旦进入就会被认为异常得到处理,catch子句结束,try-catch则结束。finally 和switch-case中的default差不多,存在的话就会被运行


异常处理可分为两种基本类型:终止类型和恢复类型

终止类型的是直接抛出不尝试修正异常,而恢复类型则是尝试修正,虽然恢复类型看起来更加实用,但是这也会增加耦合性,主要还是恢复类型依赖抛出位置的非通用性代码。


throw关键字和throws关键字

throw:手动抛出异常,在方法的某处插入“throw new Exception(); ”来手动抛出异常,程序一旦运行到throw 语句,正如上文所说,当前路径就会结束,进入异常处理程序,所以throw 语句后面的程序都不会被运行。

throws:在方法名后声明可能抛出的异常,可以声明多个异常,如“ 方法名 throwsException,Exception1, Exception2,...”,个人喜欢把它形容为“预计异常声明”,表示方法中可能会遇到这些、抛出这些异常。

例一:

void MethodName throws Exception,Exception1, Exception2,...(){

    int I;

    I = 1;

    throw new IOException();

    I = 2;

}

例二:

try{

    int I,J;

    I = 1;

    throw new IOException();

    I = 2;

} catch(IOException e){

    …

    J = 1 ;

} catch(Exception e){

    …

    J = 2 ;

}

finally{

    …

    I = 5 ;

}

(在例一中,在” throw new IOException(); ”抛出异常之后,” I = 2; ”这条语句则不会被执行。

在例二中,在” throw new IOException(); ”抛出异常之后,” I = 2; ”这条语句则不会被执行,匹配异常处理程序,与catch(IOException e)匹配执行后,直接跳过catch(Exception e)执行finally语句,所以最后I=5 J=2)


创建自定义异常

         在上文介绍Throwable类的时候明白所有类型都继承自Exception 类,要自己定义一场了,最好是选择意思相近的异常类继承,例如:运行时出现的异常(运行异常)则选择继承Exception 类的子类RuntimeException类,编译时出现的异常时(编译异常)一般选择直接继承Exception 类。

如:

class MyException extends Exception{

       System.out.println(“MyException”);

}

使用时和其他异常类型一样,如:

try{

    …

    throw new MyException ();

    …

} catch(MyException e){

    …

}

    …



 

------------------------------------------------分割线----------------------------------------------------------

上文如有错误、写得不合理以及有疑惑的地方,希望您可以在评论区提出。

在下十分感谢。

如果只是想在评论区吐吐槽、聊聊心得、卖个萌,同样也十分欢迎。

祝大家生活美好,干杯!~( ゜▽゜)つロ

 

转载请注明原作者以及附上原文章地址,谢谢。