Java面向对象程序设计异常处理_第1页
Java面向对象程序设计异常处理_第2页
Java面向对象程序设计异常处理_第3页
Java面向对象程序设计异常处理_第4页
Java面向对象程序设计异常处理_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java面向对象程序设计深圳职业技术学院软件技术专业异常处理内容提要4异常的基本概念123Java异常处理机制掌握try-catch语句的用法掌握throws关键字的用法什么是异常?classMyMath{ publicint

devide(int

x,inty){

intresult=x/y; returnresult; } }classMyMathTest{ publicstaticvoidmain(String[]args){

MyMath

mobj;

mobj=newMyMath();

intresult; result=mobj.devide(3,0);

System.out.println("theresultis"+result); } }该程序编译能通过吗?运行程序,有什么信息返回?异常Exceptioninthread"main"java.lang.ArithmeticException:/byzero这说明,程序发生了算术异常(ArithmeticException),非正常的结束了。这种情况就是我们说的异常异常定义了程序中遇到的非致命的错误,而不是编译时的语法错误。如除数为0,打开一个不存在的文件,操作数越界等等。异常的基本概念运行时发生的错误称为异常。如果不对异常进行处理,那么一旦引发异常,程序将突然中止。要么控制权返回给操作系统。要么系统处于死机崩溃状态。因此,安全健壮的程序设计语言应当引入有效的异常处理机制对MyMathTest类进行如下修改classMyMathTest{ publicstaticvoidmain(String[]args){

try{

MyMath

mobj;

mobj=newMyMath();

intresult; result=mobj.devide(3,0);

System.out.println("theresultis"+result);

}catch(Exceptione){

System.out.println(e.getMessage()); }

System.out.println("programisrunninghere."); } }说明我们看到,当我们在程序中加了红色的代码后,在出现了异常后,程序没有异常中止,而是正常的继续运行。为什么会这样呢?我们用try…catch语句对程序中可能出现异常的语句进行了处理try{ statements}catch(Exceptione){statements}try…catch语句执行过程try{

MyMath

mobj;

mobj=newMyMath();

intresult; result=mobj.devide(3,0);

System.out.println("theresultis"+result); }catch(Exceptione){

System.out.println(e.getMessage()); }

System.out.println("programisrunninghere.");catch语句块当try代码块中的程序发生了异常,系统将这个异常发生的代码行号,类别等信息封装到一个对象中,并将这个对象传递给catch代码块catch(Exceptione){ System.out.println(e.getMessage()); }Exception就是try代码块传递给catch代码块的变量类型,e就是变量名。问题一:e可以改为其他的名字吗?编程实践classNoCatch{ publicstaticvoidmain(String[]args){ Stringstr=args[0];

inti=Integer.parseInt(str);

System.out.println("输入的数据为:"+i);

System.out.println("hereistheendoftheprogram"); } }该程序运行时,如果没有输入相应的命令行参数,会怎样?如何解决?

程序修改如下classNoCatch{ publicstaticvoidmain(String[]args){

try{ Stringstr=args[0];

inti=Integer.parseInt(str);

System.out.println("输入的数据为:"+i);

}catch(ArrayIndexOutOfBoundsExceptione){

System.out.println("没有输入命令行参数");

}

System.out.println("hereistheendoftheprogram"); } }为什么?出的是什么异常?请注意,我们在catch中捕获的是哪种类型的异常?而我们现在出现的是哪种异常?要处理这种新出现的异常,我们应该怎么做呢?新增一个catch块来捕获这个异常catch(NumberFormatException

e1){

System.out.println("输入数据的格式不正确");}运行结果怎样?还会出这种异常吗?为什么?小结try…catch语句格式try{ statements//可能产生异常的程序代码}catch(ExceptionType1e){

//ExceptionType1类型异常的catch子句

statements //出现ExceptionType1类型异常时的处理程序}catch(ExceptionType2e){

//ExceptionType1类型异常的catch子句

statements //出现ExceptionType1类型异常时的处理程序}……finally{ statements //异常处理程序结构的统一出口}异常结构执行流程试一试编写程序以命令行参数形式输入两个整数,要求计算并输出两个整数相除的商和余数,程序中必须对无命令行参数或少命令行参数引起的ArrayIndexOutOfBoundsException异常、数据格式不对引起的NumberFormatException以及除数为0引起的ArithmeiticException异常分别进行捕获。提问我们现在知道,在Java中采用try…catch语句处理异常。假设,MyMath类是由甲写的,而MyMathTest类是由乙写的,那么,在乙使用MyMathTest类时,怎么能知道devide方法有可能出现异常呢?他又怎么会想到用try…catch语句去处理呢?在Java中,我们可以通过throws关键字来解决这个问题。修改MyMath类classMyMath{ publicint

devide(int

x,inty)throwsException{

intresult=x/y; returnresult; } }classMyMathTest{ publicstaticvoidmain(String[]args){

MyMath

mobj;

mobj=newMyMath();

intresult;

result=mobj.devide(3,1);

System.out.println("theresultis"+result); } }注意,此时程序应该不会发生异常,但程序能编译通过吗?将MyMathTest类中添加try…catch语句publicstaticvoidmain(String[]args){

try{

MyMath

mobj;

mobj=newMyMath();

intresult; result=mobj.devide(3,0);

System.out.println("theresultis"+result);

}catch(Exceptione){

System.out.println(e.getMessage()); } } throws关键字如果在一个方法中的语句执行时可能生成某种异常,但又不能确定如何处理,则此方法应声明抛出异常(如throwsException),表明该方法不对这些异常进行处理,而由该方法的调用者负责处理。对于检查型异常,调用者要么用try…catch语句进行处理(如上面我们的做法);要么继续抛出该异常(如在上面的程序中,我们是在main方法中调用devide方法的,如果在main方法中不处理Exception类型异常,可以继续抛出该异常)。publicstaticvoidmain(String[]args)throwsException问题我们在前面的例子中,如果我们要从键盘输入数据,我们是如何写的?publicstaticvoidmain(String[]args)throwsIOException{

BufferedReaderrd;rd=newBufferedReader(new

InputStreamReader(System.in));Stringstr1=rd.readLine();

……}为什么要添加throwsIOException?如果不添加throwsIOException,编译能通过吗?还可以怎样修改?试一试请分别使用两种方法修改下面程序,使程序能正常编译运行。classThrowDemo{ publicstaticvoidmethodDemo(inti)throwsIOException,ClassNotFoundException{

if(i>0)thrownewIOException();

if(i<0)thrownewClassNotFoundException();}publicstaticvoidmain(String

args[]){ if(args[0].length<1){

System.out.println(“请以命令行参数形式输入1个整数”); return;}inti=Integer.parseInt(args[0]);methodDemo(i);}}异常分类Error异常Error异常:运行时间出现的系统内部的错误以及资源耗尽等情况。如:虚拟机内部发生错误、电源断电引起的异常中止等。特点:这类异常性质严重,本身难以控制,且恢复可能性极小,意义不大。Java不要求对这类异常进行必要的控制,编译期也不对这类异常进行检测。RuntimeException异常RuntimeException及其子类描述的异常,一般是由于编程错误引起的异常。如:错误的造型、数组越界存取、空指针访问等。特点:完全可以通过改进程序加以克服,且数目很大。Java对这种异常的处理:编译时,不对这类异常进行检测;运行时,会自动在异常发生处生成相应的异常的对象,并由系统默认的异常处理器处理(通常输出错误信息及错误地点)。应用程序可以对其进行捕获处理(但不提倡)。运行环境引发的异常运行环境引发的异常。如:网络不通,文件找不到等。特点:只要运行环境正常,程序是可以正常运行的。Java要求对这类异常进行必要的控制。试一试classMyMath{ publicint

devide(int

x,inty)throwsArithmeticException{

intresult=x/y; returnresult; } }classMyMathTest{ publicstaticvoidmain(String[]args){

MyMath

mobj;

mobj=newMyMath();

intresult; result=mobj.devide(3,0);

System.out.println("theresultis"+result); } }检查和非检查型异常非检查型异常:编译期间编译器不对其进行检查的异常,包括Error类和RuntimeException类及其子类。检查型异常:除非检查型异常以外的其它异常。编译时,编译器对方法进行分析,如方法中有产生这种异常的可能,那么方法中要么有异常的处理模块,要么必须在方法头部抛出异常,否则,不能通过编译。那么,Exception是检查型还是非检查型异常?ArithmeticException呢?自定义异常自定义异常也是一个类,如果我们要创建检查型的异常,我们可以继承Exception类;如果我们要创建非检查型的异常,我们可以继承RuntimeException

类如何创建自定义异常打开MyMath.java文件,假设我们在devide方法中不允许有负的除数,当接收到一个负的除数时,程序返回一个自定义的异常,通知调用者。首先创建一个异常类DevideByMinusExceptionclassDevideByMinusExceptionextendsException{ //定义子类构造器方法

publicDevideByMinusException(String

msg){

super(msg); }}抛出自定义异常 classMyMath{ publicint

devide(int

x,inty)

throwsArithmeticException,DevideByMinusException{

if(y<0)thrownewDevideByMinusException("除数为负数");

intresult=x/y; returnresult; } }throw关键字用throw语句可以创建并抛出明确的异常语法形式:ThrownewxxException();如:

try{

if(flag<0){ thrownewNullPointerException(); } }……调用者需做的修改classMyMathTest{ publicstaticvoidmain(String[]args){ try{

MyMath

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论