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的子类,其余的都是检查异常)
异常处理机制
上文介绍时,提到了检查异常出现时时一定要被处理的,那么接下来介绍异常处理机制。
异常处理机制可分为两个过程:抛出异常和捕获异常
抛出异常
当遇到异常情形的时候,程序的当前环境无法获得必要的信息解决问题,所能做的就是把问题提交给上一级环境。当抛出异常之后,创建异常对象,会在堆上建立异常对象的引用,异常对象携带异常的类型等信息,当前的执行路径被终止,并由异常处理机制来寻找合适的异常处理程序。
捕获异常(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){
…
}
…
------------------------------------------------分割线----------------------------------------------------------
上文如有错误、写得不合理以及有疑惑的地方,希望您可以在评论区提出。
在下十分感谢。
如果只是想在评论区吐吐槽、聊聊心得、卖个萌,同样也十分欢迎。
祝大家生活美好,干杯!~( ゜▽゜)つロ
转载请注明原作者以及附上原文章地址,谢谢。