Java——异象处理

本章内容


异常简介



异常的定义

ü示 例       ArrayException.java

异常类的继承关系

异常的继承树


异常类的体系结构


nObject类的直接子类Throwable描述了所有被虚拟机抛出的非正常状况。一般情况下很少用Throwable,而是使用它的两个子类Error、Exception。

nError类特指应用程序在运行期间发生的严重错误。如:虚拟机内存用尽、堆栈溢出等等。一般情况下这种错误都是灾难性的,所以没有必要使用异常处理机制处理Error。

nException类有几十个子类,描述了不同类型的异常,其中:

n以RuntimeException为代表的一些类,称为非检查性异常(unchecked

Exception),

n以IOException为代表的一些类为检查性异常(checkedException)。所谓的检查和非检查是指编译器在编译时是否检查。如果代码中存在检查性异常,必须进行异常处理,否则编译时不能通过;而非检查性异常编译时不进行检查,到运行时才会显现。

异常类型              

 示例:CheckException.java


检查性异常(checked    exception)

若系统运行时可能产生该类异常,则必须写出相应的处理代码,否则无法通过编译

非RuntimeException异常

非检查性异常(unchecked  exception)

若系统运行时可能产生该类异常,则不必在程序中声明对该类异常的处理,就可以编译执行

RuntimeException:运行时异常

Java为何分别处理这两类异常?

      一般我们不在  代码中处理非检查性异常,这类异常都在运行时抛出。原因主要是由于程序员经验不足或是思维不缜密造成。如:数组越界异常(ArrayIndexOutOfBoundsException)、整数除以0异常(ArithmeticException)等,这类异常其实就是我们通常说的bug。所以,这类异常应通过反复测试尽量避免,而不应该靠异常处理机制来解决。

       检查性异常不同,就算程序员再有经验,也是难以避免。如:用户连接数据库的异常(SQLException),如果是由于数据库服务器没有启动或是网络中断引起的,我们程序员是无法避免的。又如:程序要读取光盘中的文件,而用户忘记插入光盘,此时则抛出文件没找到异常(FileNotFoundException),程序员也无法避免。

  综上,异常处理机制主要处理检查性异常而不是非检查性异常和Error。

异常类型




异常的处理过程  

 示例:ArrayException.java


在Java程序执行过程中如果出现异常事件,系统会发出异常报告,这时系统将生成一个异常类对象,异常类对象封装了异常事件的信息并将其提交给Java运行时系统

Java 中可用于处理异常的两种方式:

     自行处理:可能引发异常的语句封入在 try块内,而处理异常的相应语句则封入在catch 块内。

      回避异常:在方法声明中包含 throws子句,通知潜在调用者,如果发生了异常,必须由调用者       处  理。

try…catch语句            

 示例  Exception_sample_1.java    


异常处理机制

try…catch语句


catch块,是用来捕获并处理try块抛出的异常的代码块。没有try块,catch块不能单独存在。我们可以有多个catch块,以捕获不同类型的异常

如果程序抛出多个不同类型的异常,我们需要多个catch()语句来处理。

和特殊异常类相关联的catch()块必须写在和普通异常类相关联的catch()之前。

try {…} 和catch () {…} 之间不可以添加任何代码

try…catch语句

示例    Exception_sample_2.java

每次try块有异常抛出,系统会试着从上到下往每个catch块中传参,直到遇到一个类型匹配的catch块为止。

如上示例中最后一个catch块中的形参为Exception类型,它是所有异常类的父类,任何异常都可以传参到该块中,该块可以处理任何类型的异常。因此,这个catch块只能放到最后面,否则所有的异常都被它处理了,其他的catch块就不能分门别类的起作用了。

如果编写过程中我们违背了这一点,会产生编译错误:  exception

java.io.ArrayOutOfBoundsException has already bean caught

一般一个catch块中是专门处理异常的代码,在程序中这里还可以是记录日志的语句,当发生异常时记录该日志,无异常时将不会记录。

☻ 练习

以下代码的执行结果是:


A.finished    B.Exception     C.编译错误   D. Arithmetic Exception

                                   答案C

 catch表达式调整

     –JDK 7中,单个catch块可以处理多个异常类型 

–这种用法是不包括异常的子类型的。比如说,下面这个多个异常的捕获语句就会抛出编译错误:

finally 语句

finally语句放在try  …catch语句后

fianlly语句中的代码块不管异常是否被捕获总是要执行

通常在finally语句中可以进行资源的清除操作,如:关闭打开文件、删除临时文件

对应finally代码中的语句,即使try代码块和catch代码块中使用了return语句退出当前方法或般若break跳出某个循环,相关的finally代码块都有执行。

当try或catch代码块中执行了System.exit(0)时,finally代码块中的内容不被执行

   示例    Exception_Sample_3.java



☻ 练习

以下代码的执行结果是

throws关键字  

   示例   Exception_sample_4.java

如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理,则可以在程序所在的函数声明后,使用throws关键字抛出异常


位置:函数参数列表的后面

throws关键字后面,可以跟多个异常,中间用逗号分割

throws关键字抛出的异常,由调用该函数的函数处理。

示例:Exception_Sample_5.java

方法中如果用throws关键字抛出:

非检查性异常:上一级去除异常,直到不抛出异常;

检查性异常

   在调用该函数内try-catch,把异常处理掉。那么不往上一级抛出异常,程序正常执行,上一级方        法  并不知道曾经产生异常。

  用throws声明方法抛出异常,不进行处理。谁调用谁负责处理

  覆盖方法抛出异常时,可以抛出与被覆盖方法相同的异常或者被覆盖方法异常的子类异常。


throw语句        

异常是通过关键字 throw抛出,程序可以用throw语句引发明确的异常。如:


throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。不能单独使用,要么和try..

catch…一起使用,要么和throws一起使用。

throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象



方法调用堆栈

–后进先出:方法A调用方法B的时候,只有方法B先完成后,方法A才完成。先执行的方法总是后完成,后执行的方法先完成,类似于数据结构中的堆栈--后进先出,我们称之为方法调用堆栈。–如示例,仅有一条语句抛出异常,会导致所有的方法都不能正常结束。如果不想出现这样的情况,我们就要使用java的异常处理机制-抓抛模型。



自定义异常类      

如果Java提供的异常类型不能满足程序设计的需要,我们可以定义自己的异常类型。

用户自定义的异常类应为Exception 类(或者Exception类的子类)的子类

                    示例    DevideByMinusException.java

                               DevideMath.java

                                    Test.java

本章重点总结

异常类的继承关系

            检查性异常

            非检查性异常

异常处理机制

        try、catch、finally语句

        throw、throws关键字

        自定义异常类

课后作业

1、编写应用程序,从命令行传入两个整型数作为除数和被除数。要求程序中捕获NumberFormatException 异常和ArithmeticException 异常,而且无论在哪种情况下,“总是被执行”这句话都会在控制台输出。 [必作题]

在命令行输入不同的参数时能输出如下各种结果:

1.1 在命令行输入 java A 

1.2 在命令行输入 java A 1 2


1.3 在命令行输入 java A 1 3a 

1.4 在命令行输入java A 1 0

2、编写一个检查给定的数字的数据类型是否为byte的程序,如果此数字超出byte数据类型表示的数的范围,则引发用户自定义的异常ByteSizeException,并显示相应的错误信息(知识点:自定义异常) [选作题]

步骤1:创建用户自定义异常类ByteSizeException

步骤2:在main方法中编写逻辑代码

步骤3:运行并测试

效果如图:

3、编写一个方法,比较两个字符串。假如其中一个字符串为空,会产生NullPointerException异常,在方法声明中通告该异常,并在适当时候触发异常,然后编写一个程序捕获该异常。 [必作题]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容