【软件构造】关于Java的异常处理

        作为一个初学Java的小白,在软件构造课程开始前,只是学习了Java的基本语法,对于异常了解的也很少,这也让我在写实验时很是苦恼(悲),零零散散看了一些博客,也无法让我有很深刻的理解,所以我决定较为系统地学习一下Java的异常。(老杜yyds)
        我对于异常的第一印象就是代码出错时,那一坨“无情”的红色字符,异常其实就是程序执行过程中出现的不正常的情况,在出现这些不正常情况时,JVM会将异常信息打印到控制台,供程序员参考,所以异常是帮助程序员提高程序健壮性的好帮手。
        那么在Java中异常是以什么形式存在的呢/strong>异常是以类的形式存在的,它就和别的类一样,也可以new对象,当程序中遇到异常情况时,JVM就会new一个对应异常的对象。

·对于throws,我们还需要注意以下几点:

  1. 如果出现异常a,通过throws把异常a抛给了调用者,如果调用者继续上抛,上抛的异常可以是异常a,也可以是异常a的父类。

2、throws后可以跟多个异常类,中间用逗 隔开,throws 异常a,异常b。

·对于try…catch,我们还需要注意以下几点:

  1. 如果try中的程序出现了异常,被catch捕捉到了,那么就会执行catch中的代码,try中出现异常的语句之后的语句不会执行。捕捉异常之后,try…catch之后的语句都可以正常执行。

                try{

                语句1;

                语句2;

                }catch(异常类型 引用名){

                语句3;

                }

                语句4;

        例如上面的结构,如果语句一出现了异常,那么语句二就不会执行,而去catch中匹配,如果捕捉到异常,就执行语句三,然后执行语句四。

        2、可以有多个catch语句,如果出现异常,从上到下依次匹配,且注意需要“从小到大”排序,不能出现父类异常在上,子类异常在下的情况(否则子类永远不会被匹配到,编译器也会 错)。

        3、catch(异常类型 引用名),引用名指向接受到的异常对象,上面提到过如果遇到异常,JVM会new一个对应类型的异常对象出来,catch中接收的就是这个异常对象,所以引用名指向的就是该异常对象。

        4、如果一个方法选择上抛而不是接受异常,那么当一条语句出现异常时,该方法就会结束,不会执行后面的语句!

        5、catch小括 中的异常类型可以是可能发生的异常的父类,只要能捕捉到就可以。

        6、在Java8之后,catch小括 中可以用“|”来表示或,将几种异常类型统一处理。

                例如:

                                try{

                                语句1;

                                }catch(异常类型1|异常类型2|异常类型3 引用名){

                                语句2;

                                }
下面说一下finally字句,try可以和finally字句配合使用,可以有try…catch…finally或者try…finally,finally中的语句是一定会执行的。下面举几个例子帮助理解:

执行如上代码,输出的结果是1,3,4.

执行如上代码,输出的结果是1,4.

        那我们来猜一猜上面这个输出的结果是什么呢101,101吗是!!!执行后会发现,结果是101,100!101是finally中输出的,100是main方法中输出的,按理说a++发生在return前,但是为什么a是100呢这里,我们需要知道Java中的几个规则:1、Java语句的执行是从上到下执行的,return语句的上一句是int a=100,所以return的一定是100。2、return语句一执行,方法就会结束,而finally方法一定会执行,所以finally一定发生在return之前(从上面的那个例子也可以看到)。这里看起来似乎是矛盾的,如何才能同时满足这两条规则呢们可以看一下该程序生成的class文件的反编译结果:

        我们惊奇的发现,在反编译得到的程序中,声明了一个中间变量var1,将a的值赋值给var1,最后返回var1,而在finally中对a进行加一操作!SUN公司的程序员用这种方式同时满足了以上的两个规则,令人惊奇!

        如此看来,finally一定会执行,是吗不是。如果使用System.exit()退出JVM,finally语句就不会执行了。

        上面我们一直在对异常进行处理,那么这些异常来自于哪里呢strong>异常是如何抛出的呢

们跟踪某一个异常,就会发现在该异常内,用throw关键字抛出了异常。这就是异常的产生,SUN公司在其写好的异常内部抛出了异常,那我们也可以自己定义异常类型,自己抛出异常,都是一样的!我们可以用“throw new 异常类型()”的方式抛出异常,如果我们在一个方法中抛出了异常,那我们肯定不会在该方法内就捕捉这个异常(自己抛,自己捉,玩呢!),一定会把这个异常上抛给调用者,让调用者去处理。

我们也知道如何抛出异常了,那接下来我们就自己定义一个异常类吧。一共有两步:

第一步,编写一个类,继承Exception或者RuntimeException。(发生概率高就继承Exception,发生概率低就继承RuntimeException)

第二步,提供两个构造方法,一个无参数的,一个带有String参数的。

例如下图:

我们就可以用自己定义的异常了。

以上就是我根据老杜的课总结的关于异常的内容,写完这篇博客,也让我对异常有了更深的理解,感谢老杜!!!如果有写错的地方,也请大家指正(求饶)。

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树控制执行流程通过异常处理错误92868 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月8日
下一篇 2022年5月8日

相关推荐