(根据http://www.imooc.com/learn/110 陈码农老师教学视频总结)
?
所有不正常类都继承于Throwable类
表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
(参考 http://bbs.itheima.com/thread-117155-1-1.html wanghe826的回答)
?
分为:runtime exception和checked exception。
面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常
try{ |
//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里 |
}catch(Exception e){ |
//处理该异常的代码块,发出警告、记录错误日志 |
} |
?
eg. 引用了空对象的属性或方法(空指针),数组访问越界、错误类型转换、除数0算数异常
运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一.
?
如果不对RuntimeException处理,出现运行时异常之后,要么是线程中止,要么主程序终止。
?
如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。
?
如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。
?
检查异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。
多个catch
try{ |
//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里 |
}catch(AritheticException e){ |
//处理算数为0的情况 |
}catch(Exception e){ // 处理该异常的代码块,发出警告、记录错误日志 //算数异常使Exception 的子类,按照父亲谦让儿子的顺序 } |
?
注意:
顺序问题:先小后大,先子类、后父类,因为会自动找就近匹配的异常处理。上述Exception是上面异常的父类,所以放到最后,不然编译会报错。
具体案例参考 http://www.cnblogs.com/haitao-fan/archive/2012/05/31/2528389.html
?
finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源
?
Try{ |
//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里 |
}catch(AritheticException e){ |
//处理算数为0的情况 |
}catch(Exception e){ // 处理该异常的代码块,发出警告、记录错误日志 e.printStackTrace(); }finally{ |
//善后工作,最后要处理的代码 } |
?
throws——声明将要抛出何种类型的异常
?
public void methodName(args1,args2) |
throws 异常列表{ |
//调用会抛出的异常的方法或者throw new Exception() |
} |
?
例子
public void divide(int one, int two) throws Exception{ |
????if (two==0) |
????????throw new Exception("\"two\" can‘t be zero "); |
????else |
????????System.out.println("the result is :"+one/two); |
} |
?
必须继承java标准类中意思相近的异常类型,或者Exception
class yourName extends ExceptionType{ }
?
?
把捕获的异常包装成新的异常,从新的异常添加对原始异常的引用
package com.imooc; |
? |
public class ChainTest { |
? |
????/** |
???? * test1() 抛出drunk异常, |
???? * test2() 调用test1(),捕获drunk异常,并包装成运行时异常,继续抛出 |
???? * main()调用test2(),尝试捕获test2抛出的异常 |
???? */ |
????public static void main(String[] args) { |
????????ChainTest ct=new ChainTest(); |
????????try { |
????????????ct.test2(); |
????????} catch (Exception e) { |
????????????e.printStackTrace(); |
????????} |
????} |
? |
????public void test1() throws DrunkException{ |
????????throw new DrunkException("喝酒别开车");???? |
????} |
???? |
????public void test2() { |
????????try { |
????????????test1(); |
????????} catch (DrunkException e) { |
????RuntimeException newException = new RuntimeException("司机一滴酒,亲人两行泪"); |
????????????//调用含参构造器 |
????????????newException.initCause(e);//下面有解释 |
????????????throw newException; |
????????} |
????} |
} |
?
解释newException.initCause(e)
出处 http://zy19982004.iteye.com/blog/1975986
?
原文:http://www.cnblogs.com/xy123001/p/5245337.html