版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章JAVA异常处理第6章JAVA异常处理6.1异常的概念6.2异常处理6.3自定义异常生活中的异常正常情况下,小王每日开车去上班,耗时大约30分钟但是,异常情况迟早要发生!一路畅通堵车!撞车!什么是异常异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序绕行或者等待请求交警解决异常!面对异常该怎么办呢?通常情况下,我们会这样处理:程序运行程序中断运行堵车!撞车!生活中,我们会根据不同的异常进行相应的处理,而不会就此中断我们的生活6.1异常的概念1.什么是异常?
异常是在程序运行过程中所发生的破坏了正常的指令流程的事件。软件和硬件错误都可能导致异常的产生。程序运行出现异常时,Java运行环境就用异常类Exception的相应子类创建一个异常对象,并等待处理程序中的异常publicclassExcepNoCatch{ publicstaticvoidmain(String[]args){
inti=0; Stringgreetings[]={ "Helloworld!", "No,Imeanit!", "HELLOWORLD!!" }; while(i<4){ System.out.println(greetings[i]); i++; } }}什么是异常处理Java编程语言使用异常处理机制为程序提供了错误处理的能力程序中预先想好了对付异常的处理办法异常!程序运行处理完毕,程序继续运行对异常进行处理2.Java处理异常的机制异常处理可分为以下几个步骤:1)抛出异常:当方法中有一个错误发生后,该方法创建一个异常对象并把它交给运行时系统。2)捕获异常:运行时系统在方法调用堆栈里为被抛出的异常查找处理代码。3)异常处理:通过方法调用来处理异常4)异常终止:如果运行时系统在方法调用栈查遍了所有的方法而未找到合适的异常处理程序,则运行是系统终止执行。2.Java处理异常的机制异常发生抛出异常JAVA虚拟机强制抛出生动自成异常类对象异常处理代码捕获异常捕获异常异常类对象终止程序2.Java处理异常的机制可以灵活的处理异常,如果当前方法有能力处理异常,就捕获并处理它,否则只需抛出异常,由方法调用者来处理它。异常流程的代码和正常流程的代码分离,提高了程序的可读性,简化了程序的结构。Java处理异常的机制的特点:用Java类来表示异常情况,这种类被称为异常类。把异常情况表示成异常类,可以充分发挥类的可扩展和可重用的优势。Java中异常类的结构Java中如何进行异常处理Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws捕获异常catchtryfinally执行可能产生异常的代码捕获异常无论是否发生异常,代码总能执行手动抛出异常抛出异常throw声明异常声明方法可能要抛出的各种异常throwstry/catch块-1trycatch
try/catch
块后的代码段publicvoidmethod(){try{//代码段(此处不会产生异常)}catch(异常类型
ex){//对异常进行处理的代码段}//代码段}使用try/catch块捕获异常,分为三种情况:第一种情况try/catch块-2使用示例模拟第一种情况:publicclassMyException{publicstaticvoidmain(String[]args){System.out.print("请输入课程代号(1至3之间的数字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
System.out.println("C#编程"); break; case2:
System.out.println("Java编程"); break; case3:
System.out.println("SQL基础");}}catch(Exceptionex){
System.out.println("输入不为数字!");}System.out.println("欢迎提出建议!");}}输入:2Java编程欢迎提出建议!控制台输出try/catch块-3trycatch异常类型匹配try/catch块后的代码段进入catch块publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型
ex){//对异常进行处理的代码段4}//代码段5}使用try/catch块捕获异常,分为三种情况:第二种情况产生异常对象程序继续执行异常是一种特殊的对象,类型为java.lang.Exception或其子类
发生异常try/catch块-4使用示例模拟第二种情况:publicclassMyException{publicstaticvoidmain(String[]args){System.out.print("请输入课程代号(1至3之间的数字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
System.out.println("C#编程"); break; case2:
System.out.println("Java编程"); break; case3:
System.out.println("SQL基础");}}catch(Exceptionex){
System.out.println("输入不为数字!");
ex.printStackTrace();}System.out.println("欢迎提出建议!");}}输入:B输入不为数字!异常堆栈信息欢迎提出建议!控制台输出printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程publicclassMyException{publicstaticvoidmain(String[]args){
System.out.print("请输入课程代号(1至3之间的数字):");Scannerin=newScanner(System.in);try
{intcourseCode=in.nextInt();//此处代码省略
}catch(Exceptionex){
System.out.println("输入不为数字!");
ex.printStackTrace();}
System.out.println("欢迎提出建议!");}}try/catch块-5java.util.InputMismatchExceptionatjava.util.Scanner.throwFor(Scanner.java:840)atjava.util.Scanner.next(Scanner.java:1461)atjava.util.Scanner.nextInt(Scanner.java:2091)atjava.util.Scanner.nextInt(Scanner.java:2050)ats2jsp.sg.ch05.MyException.main(MyException.java:23)异常类型异常堆栈信息在此方法中抛出了异常try/catch块-6trycatch异常类型不匹配try/catch块后的代码段程序中断运行
发生异常publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型
ex){//对异常进行处理的代码段4}//代码段5}使用try/catch块捕获异常,分为三种情况:第三种情况产生异常对象try/catch块-7使用示例模拟第三种情况:publicclassMyException2{publicstaticvoidmain(String[]args){System.out.print("请输入课程代号(1至3之间的数字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
System.out.println("C#编程"); break; case2:
System.out.println("Java编程"); break; case3:
System.out.println("SQL基础");}}catch(NullPointerExceptionex){
System.out.println("输入不为数字!");}System.out.println("欢迎提出建议!");}}输入:B程序中断运行finally语句finally语句定义一个总是被执行的代码块,而不管有没有出现异常。publicvoidwork(){try{
开门工作8个小时//可能会抛出异常
}catch(DiseaseExceptione){
去医院看病;}finally{
关门
}}publicvoidwork(){try{
开门工作8个小时//可能会抛出异常
关门
}catch(DiseaseExceptione){
去医院看病;}}try/catch/finally-1在try/catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行try块finally块catch块无异常有异常try/catch/finally-2publicclassMyException3{publicstaticvoidmain(String[]args){System.out.print("请输入课程代号(1至3之间的数字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
System.out.println("C#编程"); break; case2:
System.out.println("Java编程"); break; case3:
System.out.println("SQL基础");}}catch(Exceptionex){
System.out.println("输入不为数字!");}finally
{
System.out.println("欢迎提出建议!");}}}输入:2Java编程欢迎提出建议!控制台输出输入:B输入不为数字!欢迎提出建议!第一种情况:无异常第二种情况:有异常编写一个类ExceptionTest1,在main方法中使用try、catch、finally:在try块中,编写被0除的代码在catch块中,捕获被0除所产生的异常,并且打印异常信息在finally块中,打印一条语句多重catch块-1一段代码可能会引发多种类型的异常当引发异常时,会按顺序来查看每个catch
语句,并执行第一个与异常类型匹配的catch语句执行其中的一条catch语句之后,其后的catch语句将被忽略publicvoidmethod(){try{//代码段
//产生异常(异常类型2)}catch(异常类型1ex){//对异常进行处理的代码段}catch(异常类型2ex){//对异常进行处理的代码段}catch(异常类型3ex){//对异常进行处理的代码段}//代码段}多重catch块-2try与异常类型1不匹配try/catch块后的代码段发生异常产生异常对象catch与异常类型2匹配catchcatch程序继续执行进入catch块多重catch块-3publicclassMyException4{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);try{System.out.print(“请输入互联网专业的总学时:");inttotalTime=in.nextInt();//总学时System.out.print(“请输入互联网专业的课程数目:");inttotalCourse=in.nextInt();//课程数目System.out.println(“互联网专业的各课程的平均学时为:"+totalTime/totalCourse);}catch(InputMismatchException
e1){System.out.println("输入不为数字!");}catch(ArithmeticExceptione2){System.out.println("课程数目不能为零!");}catch(Exceptione){System.out.println("发生错误:"+e.getMessage());}}}输入:270H在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类输出:输入不为数字!进入第一个catch块输入:2700输出:课程数目不能为零!进入第二个catch块声明异常如果一个方法不想处理异常,或者异常没有在当前的try–catch中处理,则它必须将异常抛弃给上一级调用它的方法。可以通过throws语句将异常抛向上级调用方法。如果异常被回溯到main方法仍旧没有处理,则程序将出错,终止运行。声明异常publicclassExTester{staticintmethod1(intx)throwsException{if(x<0)thrownewException("x<0");return++x;}
staticintmethod2(intx)throwsException{returnmethod1(x);}
publicstaticvoidmain(Stringargs[])throwsException{System.out.println(method2(-1));}}main()method2()method1()方法调用堆栈异常处理采用堆栈机制声明异常publicclassTeacher{privateStringid;//教师编号,长度应为7publicvoidsetId(String
pId)throws
IllegalArgumentException{//判断教师编号的长度是否为7if(pId.length()==7){id=pId;}else{thrownewIllegalArgumentException("参数长度应为7!");}}}publicclassTeacherTest{publicstaticvoidmain(String[]args){Teacherteacher=newTeacher();try{teacher.setId("088");}catch(IllegalArgumentExceptionex){System.out.println(ex.getMessage());}}}由调用者捕获异常声明该方法可能会产生异常抛出异常在JAVA程序中,引发异常共有以下两种方式使用显式throw语句来引发异常。在此情况下,控制权将无条件转到处理异常的部分代码使用语句或表达式在执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常throw语句用于立即无条件地引发异常,语法格式为:throw[异常对象];抛出异常如果在当前环境无法解决一个异常,就要将其抛出,把异常交给调用者处理publicclassTeacher{privateStringid;//教师编号,长度应为7publicvoidsetId(String
pId){//判断教师编号的长度是否为7if(pId.length()==7){id=pId;}else{thrownewIllegalArgumentException("参数长度应为7!");}}}publicclassTeacherTest{publicstaticvoidmain(String[]args){Teacherteacher=newTeacher();try{teacher.setId("088");}catch(IllegalArgumentExceptionex){System.out.println(ex.getMessage());}}}抛出异常捕获异常参数长度应为7!控制台输出编写类ExceptionTest2:定义两个方法:go()和main()在go方法中声明要抛出异常,在该方法体内,抛出一个Exception对象在main()方法中,调用go方法,使用try/catch捕获go方法中抛出的异常自定义异常类使用自定义异常的步骤:
1.通过继承java.lang.Exception类声明自己的异常类;
2.在方法中生成自定义异常的实例,并用throw语句抛出;
3.在方法的声明部分用throws语句声明该方法可能抛出的异常
import
java.io.*
;
class
MyException
extends
Exception{
private
int
id
;
public
MyException(String
message
,int
id)
{
super(message)
;
this.id
=
id
;
}
public
int
getId()
{
return
id
;
}
}
public
class
TestMyException{
public
void
regist(int
num)
throws
MyException
{
if(num
<
0)
{
throw
new
MyException("人数不能为负值",3)
;
}
System.out.println("人数:"
+
num)
;
}
public
void
manager()
{
try{
regist(-100)
;
}
catch(MyException
e)
{
System.out.println("错误!错误代码:"
+
e.getId())
;
e.printStackTrace()
;
}
System.out.println("操作结束")
;
}
public
static
void
main(String
args[])
{
TestMyException
t
=
new
TestMyException()
;
t.manager()
;
}
}用户定义异常用户定义异常是通过扩展Exception类或RuntimeException来创建的。
classAnswerWrongExceptionextendsException{privateintresult;publicAnswerWrongException(intresult){this.result=result;}publicint
getResult(){returnresult;}}用户定义异常publicclassExceptionTester{publicstaticvoidtest(int
x,int
y,intz)throwsAnswerWrongException{if(x+y!=z)thrownewAnswerWrongException(z);
System.out.println(x+"+"+y+"="+z);}publicstaticvoidmain(Stringargs[]){try{test(1,2,5);
System.out.println("end");}catch(AnswerWrongExceptione){
System.out.println("resultiswrong:"+e.getResult());
e.printStackTrace();}}}获得异常信息Exception提供了如下方法:
toString()
getMessage()
printStackTrace()try{test(1,2,5);
System.out.println("end");}catch(AnswerWrongExceptione){
e.printStackTrace();}异常处理流程finally语句不被执行的唯一情况是程序先执行了终止程序的System.exit()方法publicstaticvoidmain(String
args[]){try{
System.out.println("Begin");System.exit(0);}finally{
System.out.println("Finally");}
System.out.println("End");}异常处理流程publicstaticvoidmain(Stringargs[])throwsException{
try{
System.out.println("Begin");newSample().method1(-1);//出现SpecialException异常
System.exit(0);}catch(Exceptione){
System.out.println("Wrong");throwe;//如果把此行注释掉,将得到不同的运行结果
}finally{
System.out.println("Finally");}
System.out.println("End");}打印Begin
Wrong
Finallyjava.lang.SpecialException
异常处理流程publicstaticintmethod1(intx){try{if(x<0)thrownewException("x<0");returnx++;}catch(Exceptione){
System.out.println(“Wrong");return-100;}finally{
System.out.println("Finally");}}publicstaticvoidmain(Stringargs[]){
System.out.println(method1(-1));}打印Wrong
Finally-100常见异常ArithmeticException:数学异常inta=12/0;//抛出ArithmeticExceptionNullPointerException:空指针异常Dated=null;System.out.println(d.toString());//抛出NullPointerExceptionArrayIndexOutOfBoundsException:下标越界异常int[]array=newint[4];array[0]=1;array[7]=1;//抛出ArrayIndexOutOfBoundsExceptionClassCastException:类型转换异常:Animalanimal=newDog();Catcat=(Animal)animal;运行时异常
RuntimeException类及其子类都称为运行时异常,这种异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。例如当以下divide()方法的参数b为0,执行“a/b”操作时会出现ArrithmeticException异常,它属于运行时异常,Java编译器不会检查它:publicint
divide(int
a,intb){returna/b;//当参数b为0,抛出ArrithmeticException}
区分运行时异常和受检查异常运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误操作。一旦出现了错误操作,建议终止程序,因此Java编译器不检查这种异常。
publicvoidmethod(int[]array){
for(inti=0;i<=array.length;i++)//当i的取值为array.length时,将抛出ArrayIndexOutOfBoundsExceptionarray[i]=1;}publicvoidmethod(int[]array){
for(inti=0;i<array.length;i++)array[i]=1;//不会抛出ArrayIndexOutOfBoundsException}修改程序代码中的错误区分运行时异常和受检查异常受检查异常表示程序可以处理的异常,如果抛出异常的方法本身不能处理它,那么方法调用者应该去处理它,从而使程序恢复运行,不至于终止程序。
如果一个方法可能出现受检查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误。
voidmethod1()thro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024护理安全培训
- 物理因子疗法及康复护理水疗法
- 医护理系彭芳
- 实验室主任安全培训
- 大班语言活动生字表
- 对新员工的财务培训
- 7月珠宝活动策划方案
- 数学学案:课堂导学函数的表示方法第课时分段函数
- 2岁护理方法和技巧
- 健康扶贫培训教材
- 第五单元学雷锋在行动(教案)全国通用五年级下册综合实践活动
- 服装店人员不稳定分析报告
- GB 37219-2023充气式游乐设施安全规范
- NB-T 47013.7-2012(JB-T 4730.7) 4730.7 承压设备无损检测 第7部分:目视检测
- 《梯形的认识》(课件)-四年级上册数学人教版
- 肝吸虫护理查房课件
- 北京开放大学《现代管理专题》终结性考试复习题库(附答案)
- 小腿抽筋的原因以及缓解和自救方法定稿
- 2023年度高级会计实务真题及答案解析
- 南开大学答辩通用模板
- 国网福建省电力有限公司高校毕业生招聘笔试真题2021
评论
0/150
提交评论