java Exception

来源:互联网 发布:php下载zip文件损坏 编辑:程序博客网 时间:2024/06/05 10:29

搞清原理很重要,基础的东西一定要扎实,给自己的一句话。

throws 定义一个方法时候可以用throws关键字声明,表示此方法不处理异常,而交给方法调用处处理

public class MathDemo {    public int div(int i,int j) throws Exception{//定义除法异常,如果有异常,则交给被调用处处理        int temp=i/j;   //计算,但是此处可能出现异常        return temp;    }}//-=-=-=-=-=-=-=-=-=-=-public class ThrowDemo{        public static void main(String args[]){            MathDemo m = new MathDemo();            try {                Log.e("mrpeng", "除法操作: "+m.div(10,2));            } catch (Exception e) {                e.printStackTrace();//打印异常            }        }    }

div 使用了throws关键字声明,所以调用此方法的时候,方法外面必须进行异常处理,即 try…catch
如果在主方法也是用throws关键字,意味着主方法可以处理异常

public class ThrowDeno {    public static void main(String args[]) throws Exception {        MathDemo m = new MathDemo();        Log.e("mrpeng", "除法操作: " + m.div(10, 2));    }}

主方法不处理任何异常,而交给java最大头JVM,所以如果在主方法使用了throws关键字,则表示一切异常交给JVM处理,默认处理方式也是JVM完成。

throw关键字
作用,抛出一个异常,抛出的是一个异常类的实例化对象,
在异常处理中try语句要捕获的是一个异常对象,此异常对象也可以自己抛出

public class ThisDemo06{    public static void main(String args[]){        try{            throw new Exception("自己抛着玩的。") ;    // 抛出异常的实例化对象        }catch(Exception e){            System.out.println(e) ;        }    }}

一般开发中 try catch finally ,throw,throws联合使用情况最多

class Math{    public int div(int i,int j) throws Exception{    // 定义除法操作,如果有异常,则交给被调用处处理        System.out.println("***** 计算开始 *****") ;        int temp = i / j ;    // 计算,但是此处有可能出现异常        System.out.println("***** 计算结束 *****") ;        return temp ;    }};public class ThrowDemo02{    public static void main(String args[]){        Math m = new Math() ;        try{            System.out.println("除法操作:" + m.div(10,0)) ;        }catch(Exception e){            System.out.println("异常产生:" + e) ;        }    }};运行结果:***** 计算开始 *****异常产生:java.lang.ArithmeticException: / by zero

以上计算结束,因为没有异常发生了,直接中断程序操作,所以做以下操作。

class Math{    public int div(int i,int j) throws Exception{    // 定义除法操作,如果有异常,则交给被调用处处理        System.out.println("***** 计算开始 *****") ;        int temp = 0 ;    // 定义局部变量        try{            temp = i / j ;    // 计算,但是此处有可能出现异常        }catch(Exception e){        }         System.out.println("***** 计算结束 *****") ;        return temp ;    }};public class ThisDemo06{    public static void main(String args[]){        Math m = new Math() ;        try{            System.out.println("除法操作:" + m.div(10,0)) ;        }catch(Exception e){            System.out.println("异常产生:" + e) ;        }    }};运行结果:***** 计算开始 ********** 计算结束 *****异常产生:java.lang.ArithmeticException: / by zero

这里异常在方法中自动被处理,并没有抛出去,要抛出异常对象,给方法调用处处理,需要使用throw关键字

class Math{    public int div(int i,int j) throws Exception{    // 定义除法操作,如果有异常,则交给被调用处处理        System.out.println("***** 计算开始 *****") ;        int temp = 0 ;    // 定义局部变量        try{            temp = i / j ;    // 计算,但是此处有可能出现异常        }catch(Exception e){            throw e ;    //抛出异常。使用中也可用if判断  不用try catch        }finally{    // 不管是否有异常,都要执行统一出口            System.out.println("***** 计算结束 *****") ;        }        return temp ;    }};public class ThisDemo06{    public static void main(String args[]){        Math m = new Math() ;        try{            System.out.println("除法操作:" + m.div(10,0)) ;        }catch(Exception e){            System.out.println("异常产生:" + e) ;        }    }};

总结

throw与throws关键字联合使用问题。

1)throw:抛出异常。

2)throws:在方法声明处使用,表示此方法不处理异常,而在调用此方法处处理异常。

Exception是必须处理的,而RuntimeException异常是可以不处理的。但是为了保证程序正常运行,最好处理。

如果自定义异常,直接继承异常即可。

关于try catch finally 中的return问题
* 情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。
* 情况2:try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。
* 情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
- 情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
- 情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
- 情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。

结论:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

原创粉丝点击