1.Java异常是一个好东西,能让程序员自定义自己的异常处理程序逻辑。Java定义了一个throwable类,用于描述所以可被抛弃的东西。它有两个子类error和exception。
Error指的是合法程序正常情况下无法去捕获的异常,
exception则是合理程序正常下也应该尝试着去捕获的导常。
其中exception包含checkedexception与uncheckedexception两类。后者即runtimeexception异常,比如数组越界IndexOutOfBoundsException,空指针NullPointerException,非法参数状态IllegalStateException等。
2.一谈到java异常,也许你会想到try{}catch(Exp){}finally{}这样子的语法。
Try函数体为于业务处理,finally体将为程序执行到最后,做最后的相关处理,如文件关闭,数据库连接关闭等等。
3.异常链
如果java不存在异常链,我们将无法更新精确地定位到异常的具体位置。下面举个例子
(A异常继承B异常 B异常继续C异常 C异常继承运行时异常)
publicclass ExceptionA extendsExceptionB {
publicExceptionA() {
System.out.println("exceptionA Construtor");
}
publicExceptionA(String msg) {
super(msg);
}
}
publicclass ExceptionB extends ExceptionC {
publicExceptionB() {
System.out.println("exceptionB Construtor");
}
publicExceptionB(String msg) {
super(msg);
}
}
publicclass ExceptionB extends ExceptionC {
publicExceptionB() {
System.out.println("exceptionB Construtor");
}
publicExceptionB(String msg) {
super(msg);
}
}
下面以除0异常为测试例子
publicclass main {
/**
* @param args
* @throwsExceptionC
*/
publicstaticvoid main(String[]args) throws ExceptionC {
try{
second();
}catch(ExceptionCc){
throw c;
}
}
public staticvoidsecond() throws ExceptionC{
try{
first();
}catch(ExceptionBxx){
throw xx;
}
}
public staticvoidfirst() throws ExceptionB{
try{
int i=10/0;
}catch(Exceptionxx){
thrownewExceptionA();
}
}
}
运行结果 如下图:
exceptionCConstrutor
exceptionBConstrutor
exceptionAConstrutor
Exception in thread"main" cn.zw.exception.ExceptionA
at cn.zw.main.main.first(main.java:38)
at cn.zw.main.main.second(main.java:25)
at cn.zw.main.main.main(main.java:15)
结果很简单。
如果将上面例子两处添加异常引起的处理逻辑,如下图红色加粗字体处
publicclass main {
/**
* @param args
* @throwsExceptionC
*/
publicstaticvoid main(String[]args) throws ExceptionC {
try{
second();
}catch(ExceptionCc){
ExceptionBb =new ExceptionB();
b.initCause(c);
throw b;
}
}
public staticvoidsecond() throws ExceptionC{
try{
first();
}catch(ExceptionBxx){
ExceptionAa =new ExceptionA();
a.initCause(xx);
throw a;
}
}
public staticvoidfirst() throws ExceptionB{
try{
int i=10/0;
}catch(Exceptionxx){
thrownewExceptionA();
}
}
}
执行结果如下图,定位更加精准!
Exception in thread"main" cn.zw.exception.ExceptionB
at cn.zw.main.main.main(main.java:17)
Caused by:cn.zw.exception.ExceptionA
at cn.zw.main.main.second(main.java:26)
at cn.zw.main.main.main(main.java:15)
Caused by:cn.zw.exception.ExceptionA
at cn.zw.main.main.first(main.java:37)
at cn.zw.main.main.second(main.java:24)
...1 more