




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章JAVA异常处理第5章JAVA异常处理5.1异常的概念5.2异常处理5.3自定义异常生活中的异常正常情况下,小王每日开车去上班,耗时大约30分钟但是,异常情况迟早要发生!一路畅通堵车!撞车!什么是异常异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序绕行或者等待请求交警解决异常!面对异常该怎么办呢?通常情况下,我们会这样处理:程序运行程序中断运行堵车!撞车!生活中,我们会根据不同的异常进行相应的处理,而不会就此中断我们的生活5.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块-1trycatchtry/catch块后的代码段publicvoidmethod(){try{//代码段(此处不会产生异常)}catch(异常类型ex){//对异常进行处理的代码段}//代码段}使用try/catch块捕获异常,分为三种情况:第一种情况使用例如模拟第一种情况:Importjava.util.Scanner;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块-2trycatch异常类型匹配try/catch块后的代码段进入catch块publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}使用try/catch块捕获异常,分为三种情况:第二种情况产生异常对象程序继续执行异常是一种特殊的对象,类型为java.lang.Exception或其子类
发生异常使用例如模拟第二种情况: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("欢送提出建议!");}}java.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块-3trycatch异常类型不匹配try/catch块后的代码段程序中断运行
发生异常publicvoidmethod(){try{//代码段1//产生异常的代码段2//代码段3}catch(异常类型ex){//对异常进行处理的代码段4}//代码段5}使用try/catch块捕获异常,分为三种情况:第三种情况产生异常对象使用例如模拟第三种情况: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(InputMismatchExceptione1){System.out.println("输入不为数字!");}catch(ArithmeticExceptione2){System.out.println("课程数目不能为零!");}catch(Exceptione){System.out.println("发生错误:"+e.getMessage());}}}输入:270H在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类输出:输入不为数字!进入第一个catch块输入:2700输出:课程数目不能为零!进入第二个catch块5.2声明异常如果一个方法不想处理异常,或者异常没有在当前的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(StringpId)throwsIllegalArgumentException{//判断教师编号的长度是否为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(StringpId){//判断教师编号的长度是否为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方法中抛出的异常5.3自定义异常类使用自定义异常的步骤:
1.通过继承类声明自己的异常类;
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;}publicintgetResult(){returnresult;}}用户定义异常publicclassExceptionTester{publicstaticvoidtest(intx,inty,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(Stringargs[]){try{System.out.println("Begin");System.exit(0);}finally{System.out.println("Finally");}System.out.println("End");}常见异常ArithmeticException:数学异常inta=12/0;//抛出ArithmeticExceptionNullPointerException:空指针异常Dated=null;System.out.println(d.toString());//抛出NullPointerExceptionArrayIndexOutOfBoundsException:下标越界异常int[]array=newint[4];array[0]=1;ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年预算员备考资料试题及答案
- 注会学习的实现途径探索试题及答案
- 2024年区域经济整合试题及答案
- 2024年特许投资风险与收益试题及答案
- 2024年考试的准备材料试题及答案
- 2024监理工程师考试常见误区试题及答案
- 2024人力资源管理师考试方法试题及答案
- 深入探讨预算员试题及答案
- 黑龙江民族职业学院《水生生物统计学》2023-2024学年第二学期期末试卷
- 黑龙江省伊春市嘉荫县2025届数学四下期末教学质量检测模拟试题含解析
- 【MOOC】金融工程-厦门大学 中国大学慕课MOOC答案
- 《人力资源管理》大学期末测试题库500题(含答案)
- CQI-9 第四版 热处理系统审核表中文完整版-
- 2024-2025学年七年级语文上册专项复习:词语理解(原卷版+答案)
- 《农村中小学音乐教学现状与对策研究》课题开题报告
- CQI-23模塑系统评估审核表-中英文
- 23-24学期艺体听力 2学习通超星期末考试答案章节答案2024年
- 高值医用耗材自查报告
- 英国海德公园
- 1《氓》公开课一等奖创新教学设计统编版高中语文选择性必修上册
- 2025年辽宁中考语文复习:写作(含解析及范文)
评论
0/150
提交评论