版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 HYPERLINK /liujun13579/article/details/7742359 二十二.java程序错误类型及异常处理一、程序的错误类型在程序设计中,无论规模是大是小,错误总是难免的。程序的设计很少有能够一次完成,没有错误的(不是指HelloWorld这样的程序,而是要实现一定的功能,具备一定实用价值的程序),在编程的过程中由于种种原因,总会出现这样犹或那样的错误,这些程序的犹错误就是我们常说的“Bu犹g”,而检测并修正这些错犹误的方法就是“Debug艺”(调试)。基本艺上所有的集成开发环境都提艺供了强大的和程序调试功能艺,在程序进行编译,连接,艺运行时,会对程序中错误进艺行诊
2、断。程序的错误可以抽渊象分为三类:语法错误、运渊行错误和逻辑错误。渊1、语法错误是指由于编渊程中输入不符合语法规则而渊产生的。程序编译就通不过语,程序不能运行起来。此类语错误最简单,调试起来比较语容易例如:表达式不完整、语缺少必要的标点符号、关键语字输入错误、数据类型不匹语配、循环语句或选择语句的语关键字不匹配等。通常,编语译器对程序进行编译的过程液中,会把检测到的语法错误液以提示的方式列举出来,又液称为编译错误。 语液法错误的调试,则可以由集液成开发环境提供的调试功能液来实现,在程序进行编译时液,编译器会对程序中的语法液错误进行诊断。编译诊断的洲语法错误分为3中:致命错洲误、错误和警告。瞻(
3、1)致命错误:这个错瞻误大多是编译程序内部发生瞻的错误,发生这类错误时,瞻编译被迫中止,只能重新启瞻动编译程序,但是这类错误瞻很少发生,为了安全,编译瞻前最好还是先保存程序。盐(2)错误:这个错盐误通常是在编译时,语法不盐当所引起的。例如:括号不盐匹配,变量未声明等。产生盐这类错误时,编译程序会出盐现报错提示,我们根据提示盐对源程序进行修改即可。这斟类错误是出现最多的。斟(3)警告:是指被编斟译程序怀疑有错,但是不确斟定,有时可强行通过。例如墟:没有加void声明的主墟函数没有返回值,doub墟le数据被转换为floa父t类型等。这些警告中有些贩会导致错误,有些可以通过贩。常规解决方法:此类错
4、误贩一般程序编译系统会自动提贩示相应的错误地点和错误原贩因,比如哪一行代码少了个贩括号等诸如此类的提示,常贩见的错误,看懂直接改正即贩可,如果是看不懂原因,可贩以将错误提示信息输入搜索孵引擎查找一下,一般都能找孵到具体的解决办法。或者有孵些编程平台会本身提供一个孵本地或者在线的信息库,提孵供详细的错误原因和解决办孵法,比如微软的.NET开孵发平台。2、运行错误指诲程序在运行过程中出现的错诲误。程序通过语法错误检测诲,但是运行的时候出现错误诲,导致程序被迫终止,此类诲错误有特定的发生条件,因诲此能够准确的定位错误代码诲段,因而调试也比较方便。诲例如:除法运算时除数为0烩、数组下标越界、文件打烩不
5、开、磁盘空间不够、数据烩库连接错误等。此类错误发烩生时,编译平台一般也会提烩示相应的信息,对于常规的烩错误会有比较精确地提示,诀但有时提示的错误原因会比诀较模糊,但因为此类错误一诀般在程序运行时,只在特定诀的条件下才会发生,所以根诀据错误发生的条件,能够大诀致判断程序出错的代码段,诀结合错误的原因,也能比较诀方便的调试出错误。3、赔逻辑错误程序运行后,没有赔得到设计者预期的结果,这赔就说明程序存在逻辑错误。赔这种错误在语法上是有效的赔,但是在逻辑上是错误的。赔程序运行了,也没有出错,赔但是执行出来的结果不是用凉户想要的,分为两种情况:凉A、能够看凉出错误:比如查询工资大于凉5000的人员名单,
6、却出凉现了3000的;B、鹏看不出错误,直鹏到因缘际会发现程序肯定出鹏错了,后果很严重:比如进鹏行一个符合大型运算,把某鹏个常数输入错了,最后的结鹏果人工无法判断对错,又以鹏该结果进行其它的运算等等鹏,最后发现错了误差过大,馁就得从头排查错误。例如:馁使用了不正确的变量,指令馁的次序错误,循环的条件不馁正确,程序设计的算法考虑馁不周全等。通常,逻辑错误馁也会附带产生运行错误。在馁一般情况下,编译器在编译馁程序时,不能检测到程序中天的逻辑错误,也不会产生逻天辑错误的提示,因此逻辑错天误比较难排除,需要程序员天仔细的分析程序,并借助集天成开发环境提供的调试工具天,才能找到出错的原因,并天排除错误。
7、天二、java的异常连处理(错误处理)连程序的错误就是连通常的异常,也叫Exce连ption。觅对于语法错误,ja觅va编译系统在编就能发现觅检查出错误。冗对于逻辑错误,编译冗系统是无法发现错误的,错冗误需要人为去发现排除错误冗。对于运行错误,Java冗语言中代表异常时,使用一冗个专门的类来代表一种特定冗的异常情况,在系统中传递涅的异常情况就是该类的对象涅,所有代表异常的类组成的涅体系就是Java语言中的涅异常类体系。1、ja涅va异常类Java的异常兽是一个对象,所有的异常都兽直接或间接地继承Thro兽wable类。Throw兽able类的继承层次结构联如下:为了方便对于这些联可传递对象的管
8、理,Jav亩a API中专门设计了j亩ava.lang.Thr亩owable类,只有该类亩子类的对象才可以在系统的亩异常传递体系中进行。该类亩的两个子类分别是:1)屁Error类该类代表错屁误,指程序无法恢复的异常题情况。对于所有错误类型以题及其子类,都不要求程序进题行处理。常见的Error题类例如内存溢出Stack题OverflowErro题r等。2)Excep馅tion类该类代表异常馅,指程序有可能恢复的异常便情况。该类就是整个Jav便a语言异常类体系中的父类便。使用该类,可以代表所有便异常的情况。在Java便API中,声明了几百个父Exception的子类父分别来代表各种各样的常见父异常
9、情况,这些类根据需要父代表的情况位于不同的包中父,这些类的类名均以Ex父ception作为类名的稿后缀。如果遇到的异常情况稿,Java API中没有稿对应的异常类进行代表,也殷可以声明新的异常类来代表殷特定的情况。在这些异常类殷中,根据是否是程序自身导殷致的异常,将所有的异常类殷分为两种:a)遇RuntimeExcep遇tion及其所有子类该遇类异常属于程序运行时异常遇,也就是由于程序自身的问遇题导致产生的异常,例如数州组下标越界异常Array州IndexOutOfBo州undsExceptio州n等。该类异常在语法上州不强制程序员必须处理,即州使不处理这样的异常也不会州出现语法错误。b)州其
10、它Exceptio州n子类该类异常属于程序州外部的问题引起的异常,也州就是由于程序运行时某些外州部问题导致产生的异常,例终如文件不存在异常File艺NotFoundExce艺ption等。该类异常艺在语法上强制程序员必须进艺行处理,如果不进行处理则艺会出现语法错误。熟悉异郧常类的分类,将有助于后续郧语法中的处理,也使得在使郧用异常类时可以选择恰当的郧异常类类型。2、常见的郧error类3、常见液运行时异常类4、常用的液非运行时异常5、Ja议va的异常处理机制描述如洲下:在一个方法的运行过程洲中,如果发生了异常,则这洲个方法(或者是Java虚洲拟机)生成一个代表该异常薛的对象(它包含了异常的详薛
11、细信息),并把它交给运行薛时系统,运行时系统寻找相薛应的代码来处理这一异常。薛我们把生成异常对象并把它薛提交给运行时系统的过程称薛为抛出(throw)一个薛异常。运行时系统寻找相应许的代码来处理这一异常,系许统在方法的调用栈中查找,许从产生异常的方法开始进行许回朔,沿着被调用的顺序往许前寻找,直到找到包含相应许异常处理的方法为止。其过许程如图10-1所示。这一许过程称为捕获(catch耶)一个异常。如该异常未进耶行成功捕获,则程序将终止耶运行。5耶、异常捕获和处理格式:殉try正常程序段,可能殉抛出异常;catch症(异常类1 异常变量)症捕捉异常类1有关的处症理程序段;catch症(异常类2
12、 异常变量)戌捕捉异常类2有关的处戌理程序段;fina戌lly一定会运行的程序戌代码;l try块赢捕获异常:用于监控可赢能发生异常的程序代码块是赢否发生异常,如果发生异常赢,Try代码块将抛出异常蓄类所产生的对象并立刻结束蓄执行,而转向异常处理ca蓄tch部分。对于系统产生在的异常或程序块中未用tr在y监控所产生的一场,将一在律由java 编译系统自在动将异常对象抛出。l肢catch块处理异常肢 :抛出的异常对象如果属肢于catch内所定义的异肢常类,则catch会捕获肢该异常,并进入catch浙中的对应代码段继续运行程浙序,如果异常对象不属于c浙atch中所定义的异常类浙,则进入final
13、ly块浙继续运行程序。Catch洱包括两个参数:一个是类名洱,指出捕获的异常类型,必洱须使Throwable类洱的子类;一个是参数名,用洱来引用被捕获的对象。Ca洱tch块所捕获的对象并不洱需要与它的参数类型精确匹洱配,它可以捕获参数中指出汉的异常类的对象及其所有子汉类的对象l final汉ly块最终处理:无论汉是否发生异常都会执行的语汉句块。比如执行关闭打开的汉文件、删除临时文件,关闭汉数据库连接等操作。注意肌:l一个try、ca肌tch、finally块肌之间不能插入任何其它代码肌lcatch可以有多计个,try和finall计y只能有一个ltry计后面必须要跟catch、赐finally
14、其中的一个赐,即但一个try、cat赐ch、finally语句赐只能省略catch、fi赐nally中的一个。定吵义多个catch可精确地吵定位java异常。如果为吵子类的异常定义了特殊的c吵atch块,而父类的异常吵则放在另外一个catch防块中,此时,必须满足以下防规则:子类异常的处理块必防须在父类异常处理块的前面防,否则会发生编译错误。所防以,越特殊的异常越在前面防处理,越普遍的异常越在后防面处理。这类似于 制订防动火墙的规则次序:较特殊的动规则在前,较普通的规则在动后。异常类常用方法动6、异常实例1)疆数学运算异常cl疆ass MathExce疆ptionpubli饯cstatic v
15、oi截d main(Strin截gargs)截inta=5,b=0截; intc=a/创b; /创除数为0,出现异常创System.out.p创rint(c); 秽在命令提示符下运行该程秽序,可以发现编译正常,但秽是执行时出现错误的提示如识下:Exception斡inthreadma斡injava.lan巫g.Arithmetic茸Exception: /茸by zero千at Math千Exception.ma千in(MathExcep千tion.java:4)千翻译过来就是:在类ja欧va.lang.Arit欧hmeticExcept欧ion主线程中“main史”方法中出现异常:除数为史零
16、,(MathExcep史tion.java:4“史此处指MathExcep屁tion类中的第四行”)屁 这是一屁个典型的运行错误,程序告屁诉了一下几个信息;l落出错的异常类:java.落lang.Arithme落ticException落l 出错的类:Math挖Exceptionl挖出错的代码:MathEx挖ception.java骗:4因为编译系统给出了骗出错的原因和出错类的位置骗,可以方便地进行代码调试骗。2)捕获数学运算异常馁的处理java HYPERLINK /liujun13579/article/details/7742359 o view plain 怂怂怂怂怂怂田田view p
17、lain HYPERLINK /liujun13579/article/details/7742359 o copy 田田田田田田亩copyp亩ublicclassT亩ryCatchDemo亩public鳃staticvoid鳃main(String鳃args)鳃try圃圃inta=8,b=0;圃污intc=a/b;污Sy污stem.out.pri污nt(c);菱/A菱rithmeticExc菱eption是异常类的名菱称,e是引用的参数名称菱catch乔(ArithmeticE乔xceptione)乔S乔ystem.out.pr铆intln(发生的异常铆简短描述是:+e.ge铆tMessag
18、e();瘤Sys瘤tem.out.prin瘤tln(发生的异常详细泪信息是:+e.toSt泪ring();泪泪程序执行结果:七发生的异常简短描述是:/七by zero发生的异七常详细信息是:java.婶lang.Arithme婶ticException婶: / by zero婶3)数组下标越界异常怂java HYPERLINK /liujun13579/article/details/7742359 o view plain 怂怂怂怂怂怂疲view疲plain HYPERLINK /liujun13579/article/details/7742359 o copy 疲疲疲疲疲疲撒copypu
19、blic撒classarray撒Exception流pub流licstaticvo流idmain(Stri熔ngargs)熔煮煮/被监视的代码块煮煮try虚绣渣int渣a=newint4渣;雍雍a4=雍9;佣赢赢/处赢理下标越界异常言言catch(Ar言rayIndexOutO言fBoundsExcep言tionaiobe)直直直System.直out.println(眨这里出现的错误类型是:眨数组下标越界!);眨眨盈盈/处理空引盈用异常踊踊catch(NullPo踊interExcepti旬onnpe)旬旬旬System腰.out.println腰(这里出现的错误类型是腰:空引用!);腰腰闸
20、闸f闸inally寨寨Sy寨stem.out.pri寨ntln(程序无条件执盈行该语句!);盈盈盈盈乔三乔、异常的抛出异常的抛出碗可以分为两大类:l 系碗统自动抛出异常比如上面的碗例子就是系统自动抛出异常碗,通过try catch碗捕获异常对象,并继续相应妹的处理。l 通过关键妹字throw将异常对象显妹性地抛出。即在程序中生成识自己的异常对象,即异常可识以不是出错产生,而是人为识编写代码主动抛出。显性抛事出异常从某种程度上实现了裸将处理异常的代码从正常流裸程代码中分离开了,使得程裸序的主线保证相对完整,同裸时增加了程序的可读性和可裸维护性。异常沿着调用层次栖向上抛出,交由调用它的方栖法来处理
21、。为什么要在方适法中抛出异常?系统自动抛适出异常一般就能解决大部分适问题,但有时候,程序会产吗生特定的要求,需要由用户吗自己定义异常信息,又或者吗联合开发程序模块时,不同吗程序员需要将各自负责代码享部分尽量避免因程序出错影享响其他人的编码,都需要显享式抛出异常,以便程序进行享处理。这时候就需要在方法享中抛出异常。异常抛出的泪语法:throw婶new异常类( )婶;其中异常类必须Thro婶wable类及其子类。比主如:thrownew主ThrowableObj主ect(); Arit锈hmeticExcept锈ion e= new锈ArithmeticE锈xception();嗅throw e;
22、th嗅rows子句的方法声明的嗅一般格式如下: 方法名(参数列表)拄异常类铡型列表 方法体;铡举例:java HYPERLINK /liujun13579/article/details/7742359 o view plain 淹针针针针针针针view plain HYPERLINK /liujun13579/article/details/7742359 o copy 泽泽泽泽泽泽泽copyc瑶lassThrowEx瑶ception肘/th肘rowOne方法后用th肘rows声明异常类Ari杖thmeticExcep杖tionstat杖icvoidthro旨wOne(inti)旨throw
23、sArithm旨eticExceptio旨nif(音i=0)佯thrownew佯ArithmeticE佯xception(i值佯为零);/用th鸳row抛出一个异常鸳public妖staticvoid妖main(String妖args)浇/捕获异常浇try截throwOne(0);扁扁catch(Arit给hmeticExcept给ione)给Sy给stem.out.pri给ntln(已捕获到异常恳错误:+e.getM恳essage();恳吵程序执行结果:已吵捕获到异常错误: i值为盾零例:java HYPERLINK /liujun13579/article/details/7742359
24、o view plain 盾耗耗耗耗耗耗耗view plain HYPERLINK /liujun13579/article/details/7742359 o copy 浇浇浇浇浇浇浇copyi浇mportjava.i浇o.*;class浇Father班/父类方法班,没有抛出异常班public帮voidmyFunct程ion()程程System.程out.println(警这里是父类方法,该方法警没有异常抛出!);警警c警lassSonext警endsFather警/警/子类重写父类方法,有捕咀获异常抛出咀publicvo咀idmyFunctio咀n()throwsI咀nterruptedE
25、x咀ception节节Syste节m.out.printl节n(这里是子类方法,该凉方法抛出Interrup凉tedException凉异常!);天天天publicc剩lassTestExc剩eptionDemo抡pu抡blicstaticv露oidmain(Str露ingargs)露缮线/创建子类对象线线Son亩s=newSon亩();亩铆/受监视的代码铆铆try怂怂怂s.myF怂unction();劣劣凝凝/异常处理代凝码铸ca铸tch(Interrup铸tedException铸e)肿影影e.prin影tStackTrace(影);迎迎迎例:重新抛出余异常对象程序执行时, 要余求用户从键
26、盘输入一个字符余号。当输入0时,程序余执行结果:devided幼 by 0;当输入非0幼字符时,程序执行运算出幼的结果。importj幼ava.io.*;cla幼ss JavaThrow薛s public i薛ntcompute(i薛ntx) throws薛Arithmetic薛Exception 战 intz战= 10/x; /可战能抛出异常类型Arith战meticExcepti战on 的对象寻return z; 寻 publicvoi寻d method1()职intx;职try职 x=Syste职m.in.read();职 /可能抛出映异常类型IOExcept映ion的对象;映 x=x-
27、48;映 x=co映mpute(x); /朽/抛出异常类型Arith朽meticExcepti朽on的对象朽System.out朽.println(x);朽言 言catch(IOExc脏eption ioe)脏 /捕获异脏常类型IOExcepti脏on的对象;脏System.out铀.println(re铀aderror);铀 c铀atch(Arithme龙ticException龙 e) /捕获异常龙类型Arithmetic龙Exception的对象龙 Sys龙tem.out.prin田tln(devided田 by0);田 public田staticvoidm完ain(Stringa完rg
28、s) 完 JavaThrow完st1=newJava完Throws();拖t1.method暇1(); 四暇、自定义异常用户自定义的叁异常类,只需继承一个已有叁的异常类就可以了,包括继叁承Execption类及叁其子类,或者继承已自定义叁好的异常类。如果没有特别叁说明,可以直接用Exec叁ption类作为父类。乔自定义类的格式如下:乔class 异常类名乔extends Ex乔ception 羌n 自定义异常类必羌须继承自Throwabl羌e或Exception类细,建议用Exceptio细n类。一般不把自定义异常细作为Error的子类,因细为Error通常被用来表细示系统内部的严重故障。n细
29、当自定义异常是从Ru女ntimeExcepti女on及其子类继承而来时,女该自定义异常是运行时异常女,程序中可以不捕获和处理女它。n 当自定义异常女是从Throwable、晓Exception及其子晓类继承而来时,该自定义异晓常是编译时异常,也即程序晓中必须捕获并处理它。使晓用自定义异常的步骤如下:晓l首先通过继承jav仟a.lang.Excep仟tion类声明自定义的异仟常类。l在方法的声明仟部分用throws语句声仟明该方法可能抛出的异常。数l在方法体的适当位置数创建自定义异常类的对象,数并用throw语句将异常数抛出。l调用该方法时数对可能产生的异常进行捕获瘤,并处理异常。例:自定逼义一
30、个异常类,输入一个数逼,大于10,捕获异常。逼java HYPERLINK /liujun13579/article/details/7742359 o view plain 浇浇浇浇浇浇浇view浇plain HYPERLINK /liujun13579/article/details/7742359 o copy 浇浇雹雹雹雹雹copy/MyE雹xceptionDemo雹.javaclass格MyException格extendsExce格ption/继承格了Exception这个格父类技privateint技detail;技MyExc技eption(inta靠)靠靠detail=a;靠靠
31、pu靠blicString靠toString()靠君ret君urnMyExcept君ion+deta君il+;君疆classM疆yExceptionDe疆mo姐staticvoi姐dcompute(in姐ta)throwsM姐yException姐缝Sys缝tem.out.prin缝tln(调用comp缝ute(+a+缝);痴痴if(a10)痴/a大于10,则抛痴出异常坑坑thr坑ownewMyExce坑ption(a);坑坑至至System.o至ut.println(至常规退出);员员publi员cstaticvoi值dmain(Strin值gargs)值值try值盐盐comput盐e(1)
32、;盐/a小于盐10,常规退出瞻瞻瞻compute(20)瞻;/a大于10,瞻则抛出异常瞻镇镇镇catch(MyExc镇eptione)镇殉殉System.殉out.println(殉捕捉+e);殉/这样就可以用自己定义液的类来捕捉异常了液液液珠例:计算两个数之和,当珠任意一个数超出范围(10战,20)时,抛出自己的异幼常。java HYPERLINK /liujun13579/article/details/7742359 o view plain 幼幼幼幼幼淤渣v渣iew plain HYPERLINK /liujun13579/article/details/7742359 o copy 渣渣渣渣渣渣渣copy/N绚ewException.绚javaclassN绚umberRangeEx绚ceptionexte绚ndsExceptio管npub管licNumberRa管ngeException管(Stringmsg)管管super(msg)管;管/throws重新绊抛出异常NumberRa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 矿山生态修复植被重建技师考试试卷及答案
- 2025山西晋中榆次区医疗集团招聘聘用制工作人员42人笔试历年参考题库附带答案详解
- 2025山东潍坊市寒亭区选聘国有企业人才库人选50人笔试历年参考题库附带答案详解
- 2025山东东营众邦人力资源有限责任公司招聘43人笔试历年参考题库附带答案详解
- 2025四川绵阳市公共交通集团有限责任公司招聘公交车驾驶员40人笔试历年参考题库附带答案详解
- 2025四川巴中市国有资本运营集团有限公司招聘17人笔试历年参考题库附带答案详解
- 2025厦门大学出版社招聘4人笔试历年参考题库附带答案详解
- 2025内蒙古通辽市科尔沁区事业单位(国有企业)人才引进34人笔试历年参考题库附带答案详解
- 2025云南塞上阳光农业开发有限公司招聘28人笔试历年参考题库附带答案详解
- 2025中国有色集团市场化选聘4人笔试历年参考题库附带答案详解
- 医院保洁服务招投标书范本
- DB4416-T 20-2023 蓝莓种植技术规程
- 全新版大学进阶英语第二册-Unit-4-Study-Abroad
- 建筑垃圾减量化专项方案
- 咽部肿瘤-课件
- 福建省危险性较大的分部分项工程安全管理标准
- ic m710说明书中文版
- Wagstaff低液位自动控制铸造
- GB/T 9787-1988热轧等边角钢尺寸、外形、重量及允许偏差
- 统编版小学语文小升初专项训练 汉语拼音选择题
- 沙漠掘金(经典版)-沙漠掘金攻略
评论
0/150
提交评论