zoukankan      html  css  js  c++  java
  • 学习中的菜鸟之异常处理

               

                                                                                       

                秋高气爽的今天(嗯.. 今天是哪天呀),我用我近视的眼睛正在看某些该看的东西(别误会,那是老师留的另一个作业),突然宿舍的某某同学说老师在催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块的代码)

  • 相关阅读:
    VScode中Python的交互式命令环境使用笔记
    jmeter beanshell判断响应的json串,参数的值是否正确;
    类和类的继承 实现关系;
    类与类依赖关系,实例;
    类与类包含关系,实例;
    java中有package的编译执行;java编译乱码;
    java 类与类之间的关系,方法重写与方法重载的区别
    beanshell sampler构造响应数据;
    Scanner类及其中方法的使用;
    java 构造方法 代码块 this
  • 原文地址:https://www.cnblogs.com/xiangtianxiayu/p/4905969.html
Copyright © 2011-2022 走看看