异常处理
1 假设你调用了一个不是自己写的方法(调用别人写的类)
2 别人的方法执行某些有风险的任务,可能会在运行的期间出现问题
3 你必须认识到该方法是有风险的
4 得写出可以在发生状况的时候加以处理的程序代码,未雨绸缪
java的异常处理
java 的异常处理(exception-handling)
异常是一种Exception类型的对象
java.lang.Object
java.lang.Throwable
java.lang.Exception
//编写可能抛出异常的方法是,他们都必须声明有异常
public void takeRisk() throws Exception{//
if(somethingwrong){
throw new Exception();
}
}
public void testRist(){
try{
this.takeRisk();
}catch(Exception e){
e.printStackTrace();
}
}
编译器不会注意RuntimeException 类型
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
finally :无论如何都要执行的部分
如果try块失败了,会抛出异常,流程会到catch部分,当catch部分执行完成时候,会执行finally部分
当finally执行完成后,继续执行其余部分
如果try块成功了,会抛出异常,流程会跳过catch部分,会执行finally部分
当finally执行完成后,继续执行其余部分
如果try 或者catch块有return 指令,finally还是会执行,然后再跳回return指令
异常也是多态的,catch块要从小到大
catch(TeeShirtException e){
}
}catch(ShirtException e){
}
}catch(ClothingException e){
}
如果不想处理异常,可以把他再抛出去
public void takeRisk() throws Exception{
Exception e =new Exception();
throw e;
}
public void testRisk()throws Exception{
try{
takeRisk();
}catch(Exception e){
System.out.println("catch");
//e.printStackTrace();
}
finally{
System.out.println("finally");
}
异常处理规则
1 catch,finally,不能没有try
2 try catch之间不能有程序
try{
takeRisk();
}catch(Exception e){
System.out.println("catch");
//e.printStackTrace();
}
3 try 一定要有 catcch或者finlly,但要注意第四项
4 只带有finally的try必须要声明异常
public void testRisk()throws Exception{
try{
takeRisk();
}
finally{
System.out.println("finally");
}
}
再举个例子
public class Indecisive {
public static void main(String[] args) {
System.out.println(decision());
}
static boolean decision() {
try {
return true;
} finally {
return false;
}
}
}
就会发现它编译时没有任何错误,并且它所打印的是false。为什么呢?
原因就是在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行的[JLS 14.20.2]。无论try语句块是正常结束的,还是意外结束的,情况都是如此。一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个break或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句。
当try语句块和finally语句块都意外结束时,在try语句块中引发意外结束的原因将被丢弃,而整个try-finally语句意外结束的原因将于finally语句块意外结束的原因相同。在这个程序中,在try语句块中的return语句所引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。简单地讲,程序尝试着(try)返回(return)true,但是它最终(finally)返回(return)的是false。
总之,每一个finally语句块都应该正常结束,除非抛出的是不受检查的异常。千万不要用一个return、break、continue或throw来退出一个finally语句块,并且千万不要允许将一个受检查的异常传播到一个finally语句块之外去。