学习中的菜鸟之异常处理

           

                                                                                   

            秋高气爽的今天(嗯.. 今天是哪天呀),我用我近视的眼睛正在看某些该看的东西(别误会,那是老师留的另一个作业),突然宿舍的某某同学说老师在催blog文章了。

本来计划要看那些非常吸引我,让我激动万分的。。。。。网上的一些内容的我,为了解决这个异常 时决定顶住全宇宙的压力先写blog文章再那啥那啥。(嗯。就是这样)

                就像 生活中难免有些意外一样,程序中也会有一些意外的情况导致程序中断,而这些意外的情况就是程序中的异常。

   

                  异常的定义    课本版:在程序的运行过程中所发生的不正常的事件,如。。。各种错误等。异常会中断正在运行的程序

               程序员就是写可以运行的程序的,异常居然干掉了程序(让程序中断-_-!)!!!!!

               这不是砸人饭碗么。必须跟它分个高下了。

               5大绝招 之     try   catch   finally    throw    throws   

              作用为: 

                         throw:在方法体内 抛出异常对象,且只能是一个。      //可以单独使用

                         throws:在方法的参数列表后面 ,声明方法抛出了异常 ,后面可以跟多个异常的类型。     //不可以单独使用

                           

                         try-catch-finally一般连用,catch 和finally为可选,但至少有一个。

                         try:放置有可能出现异常的代码,,如一切正常  则不抛出异常,如出现不合理并且没有用判断限制的情况 抛出异常

                         catch(异常类型 ):捕获异常,如没有异常不被执行。     注:catch块要捕获异常需要声明的异常类型与发生的异常相符,catch可以有多个,子类在父类的前面(类型相容,作用面积大的那个在后面)。

                         finally:无论是否有异常或者任何 ( 除退出java虚拟机System.exit(1)  )情况都会被执行。

                    异常类型的简单架构 课本版  :

                                                                             (图为引用网上)

                                                                             Throwable:异常类的基类

                                                                             Error : 严重错误类,一般由虚拟机抛出。这种错误我们除了尽量让程序安全退出外,没有太好的办法(我没有)

                                                                             Exception :由java程序抛出的异常的直接父类

                                                                             RuntimeException:运行时错误,不要求程序必须进行异常处理,如出现异常,会终止程序。

                                                                             Checked异常:非运行时错误,要求必须进行异常处理,否则连编译都无法通过。

                                                                              

                          常见的几个异常类型:

                                    ArithmeticException:算术错误

                                    ArrayIndexOutOfBoundsException:下标越界

                                    NullPointerException:未将对象实例化 ,或对象为null

                                    InputMismatchException:欲得到的数据类型与实际输入的数据类型不匹配

                                    I(i)  ll(L)egalArgumentException:方法具有非法的参数

                                    ClassCastException:对象强制类型转换出错

                                    NumberFormatException:数字格式 转换异常                               

                                   ClassNotFoundException:不能加载所需的类

                    下面是老师总结的几种使用try-catch-finally的情况

                          

1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,
而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),
所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
举例:
情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。
情况2:try{ return; }catch(){} finally{} ;
程序执行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所以提前退出。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
编译器把finally中的return实现为一个warning。

               

                        

                          下面请看一个面试题做为结尾:

                      

                            public class FinallyTest
                            {
                                   public static void main(String[] args) {

                                        System.out.println(new FinallyTest().test());;
                                    }

                                     static int test() {
                                                                      
                                           int x = 1;
                                                try
                                               {
                                                        x++;
                                                        return x;
                                               }
                                               finally
                                               {
                                                         ++x;
                                               }
                                   }
                           } 

                           这题的结果是2。

                           前边不是说了,只要程序不中断,finally一定会执行么,那么为什么不是3呐?

 

                            原因是:finally块虽然会被执行,但是如例所示try块或者catch块中有了return,那么当时要返回的值已经在进入finally之前就确定了,再finally块里就算改变了变量的值,返回的值也不会改变。(如果return的值是固定的如常量或直接就是一个值那么程序不会先到ruturn语句,如为变量是不固定的值那会先到ruturn语句确定了值后再执行finally块的代码)

posted on 2015-10-23 23:43  上雨  阅读(182)  评论(0编辑  收藏  举报

导航