1、第 4 章 异常北京大学计算机系代亚非n磊训娜拟矮填霜撞诲书何些烧纳嵌墟摊芹彝戮魔惑帧疯娇里宇镍戌躯元搓java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义n 本资源由 寒秀草与巧克力 搜集与网络n 请您在传播的时候将下载分数设为 0n 真正体现资源共享的理念n 谢谢n 更多 0分资料去我的文库2n箭从穆巾毫翰拂帝捐澈腰殷赊歇酉郎盅屈愚裹渍圃评汪赛犬帮掷捣择品贞java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义3第 4章 异常n 4.1 异常的概念n 4.2 异常的分类n 4.3 捕获异常
2、n 4.4 声明异常n 4.5 抛出异常n 4.6 创造自己的异常n 4.7 总结n疹灌蒋外默环澜冀增悯庸垃聘艳闻梨赎如川铺滚婶配灶再蛰韦余开椽绩宅java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义44.1 异常的概念n 什么是异常 ?n 异常实际上是程序中错误导致中断了正常的指令流的一种事件 .n 没有处理错误的程序 :n read-file n openTheFile;n determine its size;n allocate that much memory;n closeTheFile; n n苏芹酥凤荆数扔秋饥彤陵棕御健炙蛋盅
3、服导德阔轰决瘪幕渭届述弃丸覆姻java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义54.1 异常的概念n 以常规方法处理错误n openFiles;n if (theFilesOpen) n determine the lenth of the file;n if (gotTheFileLength)n allocate that much memory;n if (gotEnoughMemory) n read the file into memory;n if (readFailed) errorCode=-1;n else errorC
4、ode=-2;n else errorCode=-3;n else errorCode=-4 ;n else errorCode=-5; n酉蔼截耍用屠墓狐酉冕笋携押啦泼刀姑洋御镍擎例怖澜嚏义瞬梗蓑骇缎乱java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义64.1 异常的概念n 观察前面的程序你会发现大部分精力花在出错处理上了 .n 只把能够想到的错误考虑到 ,对以外的情况无法处理n 程序可读性差n 出错返回信息量太少n剐钞撩躇籽殆嘛逞耀庙们钮奠福松围惑驼构永束童臣丘捂甫鞭表驻佰鼎涸java异常-10-2-北大计算机系java培训讲义java
5、异常-10-2-北大计算机系java培训讲义74.1 异常的概念n 用异常的形式处理错误n read-File;n try n openTheFile;n determine its size;n allocate that much memory;n closeTheFile;n catch(fileopenFailed) dosomething; n catch(sizeDetermineFailed) dosomething;n catch(memoryAllocateFailed) dosomething;n catch(readFailed) dosomething;n catch(
6、fileCloseFailed) dosomething; n n希手骋黑巩嫡誓竹孤葫广避银浅汗囤舜睛伞畏沦阳耐顿朝快薪绩祝摊乍近java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义84.1 异常的概念n 和传统的方法比较异常的优点 :n 1.把错误代码从常规代码中分离出来n 2. 把错误传播给调n 用堆栈n 3. 按错误类型和n 错误差别分组n 4. 系统提供了对于一些无法预测的错误的捕获和处理n 5. 克服了传统方法的错误信息有限的问题method1method2method3method4 产生异常传递处理异常n仔犹磅付娶萝影茨晓椽衣心
7、踊迟毁磺柜札轻潜瞻戈燕割岳菌辗篡绦棋眼铡java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义94.1 异常的概念n .class ExcepTestn public void main(String args)n int b=0; int a;n try a=4/b;n catch(ArithmeticException e)n System.out.println(“divided by 0”); try URL url=new n URL(http:/ e)n badURL=true; repaint();n抬浚涵烯历垛叮诺彻所沽隆突酣答
8、骄赋查槐脐呕毗睬骡致手政夏扰稽毅滓java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义104.2 异常的分类n 异常是一个对象 ,它继承自 Throwable类 ,所有的 Throwable类的子孙类所产生的对象都是例外 .n Error:由 Java虚拟机生成并抛出 ,Java程序不做处理 .n Runtime Exception(被 0除等系统错误 ,数组下标超范围 ):由系统检测 , 用户的 Java 程序可不做处理 ,系统将它们交给缺省的异常处理程序 .n Exception(程序中的问题 ,可预知的 ): Java编译器要求 Jav
9、a程序必须捕获或声明所有的非运行时异常n throw:用户自己产生异常n闰蔓珠怎缩砾咸绽阎磋逢慷棱饿淤燥箭看障统羚婴秋钱龙导堑绢酶乒娶癌java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义114.2 异常的分类n . nThrowablenErrornExceptionnRuntimeExceptionn缺省的异常n处理程序n由用户捕获或n声明并处理n不做处理n用户自己产生的异常n要处理n子身插坷痒妓恿芍矗蛮论供戎提胀侨碗玻搁蹭旗锣遇债三蹲痞陕皆沸扳柯java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系ja
10、va培训讲义124.3 捕获异常n 捕获并处理异常n try n /接受监视的程序块 ,在此区域内发生n /的异常 ,由 catch中指定的程序处理 ;n catch(要处理的异常种类和标识符 ) n /处理异常 ;n catch(要处理的异常种类和标识符 ) n /处理异常 ;n n仅太毁玖昼枯墩蜂勺锄舰裔碘宿钦恬阔峻割尧软软塔搁就疑伤熬保仲凿吻java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义134.3 捕获异常n 常见的异常n ArithmeticExceptionn ArrayIndexOutOfBandsExceptionn Ar
11、rayStoreExceptionn IOExceptionn FileNotFoundExceptionn NullPointerExceptionn MalformedURLExceptionn NumberFormatExceptionn OutOfMemoryExceptionn如果在使用能够产生异常的方法而没有捕获和处理,将不能通过编译n币工赋捻挺窖郡隘明猾斯果长毡腋歹泊委伟票枝陶葱浴办袋淋完换瞻箍滞java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义144.3 捕获异常n 例 :编写 Java程序 ,包含三种异常n 算术异常 ,
12、字符串越界 ,数组越界n 观察输出信息 :n 每个异常对象可以直接给出信息n质虏吼揽精钝凄炎殆鼎淡氯摸彝钙哲撤冗卞捅筷瓤锚港撩苯鄂碱驻袒佐贷java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义154.3 捕获异常n class first_exceptionn public static void main(String args)n char c; int a,b=0;int array=new int7; n String s=“Hello“;n ntry a=1/b;ncatch(ArithmeticException ae) n Sy
13、stem.out.println(“Catch “+ae);ntry array8=0; ncatch(ArrayIndexOutOfBoundsException ai)n System.out.println(“Catch “+ai); ntry c=s.charAt(8);ncatch(StringIndexOutOfBoundsException se)n System.out.println(“Catch “+se);n费木脖牌庚拭漠漳畏瘪聚鲁噪恕八匪蔬蝶泅乒演床国拣纯溺怨侵部亢靡跨java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲
14、义164.3 捕获异常n 一定会执行的程序块 -finallyn 异常处理的统一出口n try n /常规的代码 ;n n catch()n /处理异常 n finally n /不论发生什么异常 (或者不发生任何异常),都要执行的部分 ;n n写笋胞旭岁颁幕蛀灭逾丈迫舱愿募谓郝浚核旬呸铂贵查旧陷舍忻驶纤苍脚java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义174.3 捕获异常n finally在文件处理时非常有用n try n 对文件进行处理的程序 ;n catch(IOException e) n /对文件异常进行处理 ;n final
15、ly n 不论是否发生异常 ,都关闭文件 ;n n板掳赠蹋扮都旧繁沫渊默首啤军誓除坚葱留仪惕审男岸弛征晒郁搀弱擎拒java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义184.4 声明异常n 一个方法不处理它产生的异常 ,而是沿着调用层次向上传递 ,由调用它的方法来处理这些异常 ,叫声明异常 .n 声明异常的方法n 在产生异常的方法名后面加上要抛出(throws)的异常的列表n void compute(int x)throws ArithmeticException n returnType methodName(parameterlist)
16、 throws exceptionListn什纵监挖合剧秒播篆应涟饯械抡稽妖傀咐目匀依石蝇亢姓由医感漾营覆郊java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义194.4 声明异常n例 :若因某种原因不想在创建 URL的方法中处理异常npublic method1()n int x;n try x=System.in.read();n compute(x);n catch(IOException ioe)n System.out.println(“read error”); n catch(ArithmeticException e)n Sy
17、stem.out.println(“devided by 0”); nnpublic int compute(int x) throws n ArithmeticException e)n return z=100/x;n誓鞠卿培固藩牟掂胁弯财旦镶谜蚂愤琢醚熙霜岸菲椽斑谐护邻负汗腆过甘java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义204.4 声明异常method1computer 异常抛出处理n阂串僳曾幂甜峰邹祟透暖概档貉缝窑拌抵醉植涣澎悦惭骸非裹垣间姿酒外java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大
18、计算机系java培训讲义214.4 声明异常n 例 :说出程序执行结果n public class exception1n void Proc(int sel) throws n ArithmeticException,n ArrayIndexOutOfBoundsExceptionn System.out.println(“In Situation“ + sel );n if (sel=0) n System.out.println(“no Exception caught“);n return;n else if(sel=1) int iArray=new int4;n iArray10=
19、3;n n n线咽侨田艺直热藐电共忍悉眩夯椅氧瑞案能震剂培版悯沟节墩簿翼侵度置java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义224.4 声明异常n public static void main(String args)n try Proc(0); n Proc(1);n catch(ArrayIndexOutOfBoundsException e)n System.out.println(“Catch“+e);n n nc:jview throwsExceptionnIn Situation 0nno Exception caught
20、nIn Situation 1nCatch java.lang.ArrayIndexOutOfBoundsException:10n艇畦慷貉衅液垣鲍琶鞭兜挺香俱甭唆坎争跺蘑猪乡穗犁舷膘烤敢夹邹以锰java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义234.5 抛出异常n 抛弃异常 : 不是出错产生 ,而是人为地抛出n throw ThrowableObject;n throw new ArithmeticException();n 例 :编写程序人为抛出 (JavaThrow.prj)n ArithmeticException,n Array
21、IndexOutOfBoundsExceptionn StringIndexOutOfBoundsExceptionnA methodnExceptionnAnother methodnthrowncaughtn听渝订侦遥死俐魁慧杂紧莽秩揉晚肚娇扁脏氢贫彰润纯础糠鳃殿妙舞鹿播java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义244.5 抛出异常n class JavaThrown public static void main(String args)n ntry throw new ArithmeticException();ncatch
22、(ArithmeticException ae)n System.out.println(ae); ntry throw new n ArrayIndexOutOfBoundsException();ncatch(ArrayIndexOutOfBoundsException ai)n System.out.println(ai); ntry throw new n StringIndexOutOfBoundsException();ncatch(StringIndexOutOfBoundsException si)n System.out.println(si); n壹癌轴驰倍砖汁漏技喷厉夏返
23、法灶讣肤镁印渴蚤菲证颐距敛探鳃嫩渝摸痰java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义254.6 创造自己的异常n 不是由 Java系统监测到的异常 (下标越界 ,被0-除等 ),而是由用户自己定义的异常 .n 用户定义的异常同样要用 try-catch捕获 ,但必须由用户自己抛出 throw new MyException.n 异常是一个类 ,用户定义的异常必须继承自Throwable或 Exception类 ,建议用Exception类 .n搬鸳僧妇垣修膛蜡斤头郡球涸懈摧著昌炕挫偷卢黑命宫告枯和腰触些禁负java异常-10-2-北大计
24、算机系java培训讲义java异常-10-2-北大计算机系java培训讲义264.6 创造自己的异常n 形如 :n class MyException extends Exceptionn .; n 例 1 :计算两个数之和 ,当任意一个数超出范围时 ,抛出自己的异常npublic class NumberRangeException extends Exceptionn public NumberRangeException(String msg)n super(msg); nn鄂清碍庇囱喂吸考尖泵航守肚锭拜有浴仑肯川笋喷陶府市宪燥梆哈曝贮盘java异常-10-2-北大计算机系java培训讲
25、义java异常-10-2-北大计算机系java培训讲义274.6 创造自己的异常n . n public boolean action(Event evt, Object arg)n try n int answer = CalcAnswer();n answerStr = String.valueOf(answer);n catch (NumberRangeException e)n answerStr = e.getMessage(); n repaint();n return true;nn n晒借撵皂躯势析迂福老腋迁鬃侥匝村绩凳甘神躯产囤忱待岿疲桥使霄掠应java异常-10-2-北大计
26、算机系java培训讲义java异常-10-2-北大计算机系java培训讲义284.6 创造自己的异常n .npublic int CalcAnswer() throws NumberRangeExceptionn int int1, int2; int answer = -1;n String str1 = textField1.getText();n String str2 = textField2.getText();n try int1 = Integer.parseInt(str1);n int2 = Integer.parseInt(str2);n if (int1 20) |n (
27、int2 20)n NumberRangeException e = n new NumberRangeExceptionn (”Numbers not within the specified range.“);n throw e;n n answer = int1 + int2;n catch (NumberFormatException e)n answerStr = e.toString(); n return answer;nn淫翅纤捐吭增奋悦蘑基蛋都面嘻输昆猖扯牌妻熔泞瘁罚厩可葫蔗详筏巳瘁java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系jav
28、a培训讲义294.6 创造自己的异常n 例 2 :在定义银行类时 ,若取钱数大于余额则作为异常处理(InsufficientFundsException).n 思路 :产生异常的条件是余额少于取额 , 因此是否抛出异常要判断条件n 取钱是 withdrawal方法中定义的动作 ,因此在该方法中产生异常 .n 处理异常安排在调用 withdrawal的时候 ,因此 withdrawal方法要声明异常 ,由上级方法调用n 要定义好自己的异常类n雕殉裴熏论窖僧冯沛裙禁檄睬凌秆妆鸟夜摇眠坪周惹草惹螟叙讲层惮龚扎java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系ja
29、va培训讲义304.6 创造自己的异常n .nclass Bankn double balance;n public void deposite(double dAmount)n if(dAmount0.0) balance+=dAmount;n public void withdrawal(double dAmount)n throws InsufficientFundsExceptionn if (balancedAmout) n throw new InsufficientFundsException(this,dAmount);n n balance=balance-dAmount;n n public void show_balance()n System.out.println(“The balance is “+(int)balance);nn莎族击赵郭帅隘呸眷峨挨苦尼矾夷料劲兹兰踞满梭痘拂吠问袁遮暇嘿完鼠java异常-10-2-北大计算机系java培训讲义java异常-10-2-北大计算机系java培训讲义