




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 程序的异常处理8.1 异常入门在Java中,编译错误由编译程序javac产生,而运行时的错误通常称为exception(异常或例外),异常也是Java中的类。在Java编程语言中,异常有三种分类。Java.lang.Throwable类充当所有对象的父类,可以使用异常处理机制将这些对象抛出并捕获。在Throwable类中定义方法来检索与异常相关的错误信息,并打印显示异常发生的栈跟踪信息。它有Error和Exception两个基本子类,如下图所示: Throwable类不能使用,而使用子类异常中的一个来描述任何特殊异常。每个异常的目的描述如下:- Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。- RuntimeException表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。比如,如果数组索引扩展不超出数组界限,那么,ArrayIndexOutOfBoundsException异常从不会抛出。比如,这也适用于取消引用一个空值对象变量。因为一个正确设计和实现的程序从不出现这种异常,通常对它不做处理。这会导致一个运行时信息,应确保能采取措施更正问题,而不是将它藏到谁也不注意的地方。- 其它异常表示一种运行时的困难,它通常由环境效果引起,可以进行处理。例子包括文件未找到或无效URL异常(用户打了一个错误的URL),如果用户误打了什么东西,两者都容易出现。这两者都可能因为用户错误而出现,这就鼓励程序员去处理它们。1、考虑下面的程序 public class Ex1public static void main(String args) int x=0;int y;y=3/x;System.out.println(program ends ok );编译程序没有任何错误,但是在运行时会产生错误,即程序出现异常。错误的性质:/by zero(除零),这个异常为java.lang.ArithmeticException将程序修改一下:public class NoEx1public static void main(String args) double x=0; double y;y=3/x;System.out.println(y= +y);运行时不会出现异常,运行结果为:y = InfinityJava允许浮点数除零。8.2 传统的错误处理方法1、考虑下面的程序 public class ExDiv0public static void main(String args)int a = Integer.parseInt(args0);int b = Integer.parseInt(args1);int c = a/b;System.out.println(a+/+b+=+c);System.out.println(Program ends ok); 上面的程序中没有考虑3种异常的可能: 1)输入的参数是否为两个 2)输入的参数是否全部为09之间的正整数 3)被除数是否为0 为了杜绝3中异常的出现,将程序修改为: 可见我们通过这种传统的方法杜绝了程序的漏洞。8.3 基本的异常处理1、try和catch 将可能出错的代码写入到try里,将出错后的处理代码写入到catch里。try./可能出现错误的代码catch ( Exception e ) ./处理错误的代码程序演示:public class ExDiv2public static void main(String args)tryint a = Integer.parseInt(args0);int b = Integer.parseInt(args1);int c = a/b;System.out.println(a+/+b+=+c);catch (ArrayIndexOutOfBounds e)b=1; c = a/b;System.out.println(Program ends ok);运行结果参见教材第206页,详细描述了运行时出现3中错误的运行结果,我们可以看出无论出现什么异常,程序都能正确结束,而不会异常终止。总结:1)把可能出现错误的代码放在try中2)在catch中处理错误,catch必须紧跟在try后面,他们之间不能出现任何其他语句3)若try中的某语句出错,该语句后面的语句将不再执行,程序直接转入catch执行,catch中的语句执行完毕后,程序继续执行其后的语句4)若try中的语句不出现异常,程序执行完try中的语句后,跳过其后的catch ,直接执行catch后的语句5)一个try后可以跟多个catch2、Exception类及其子类 Exception是所有异常类的父类,其子类有许多,例如: NumberFormatExcepiton ArrayIndexOutOfBoundsException ArithmeticException IOException 考虑下面的程序: public class ExDiv4public static void main(String args)tryint a = Integer.parseInt(args0);int b = Integer.parseInt(args1);int c = a/b;System.out.println(a+/+b+=+c);catch (NumberFormatException e)System.out.println(-NumberFormatException-);e.printStackTrace();catch (ArrayIndexOutOfBoundsException e)System.out.println(-ArrayIndexOutOfBoundsException-);e.printStackTrace();catch (ArithmeticException e)System.out.println(-ArithmeticException-);e.printStackTrace();System.out.println(Program ends ok);3、得到异常类的信息 阅读下面的程序 public class ExDiv3public static void main(String args)tryint a = Integer.parseInt(args0);int b = Integer.parseInt(args1);int c = a/b;System.out.println(a+/+b+=+c);catch (Exception e)e.printStackTrace();System.out.println(get message=+e.getMessage();System.out.println(e=+e);System.out.println(Program ends ok);通过运行结果我们可以看到:1)getMessage方法输出的是错误的性质2)若直接输出e的信息,那么就不包含错误的所在位置3)使用Throwable类的方法printStackTrace( )可以将异常的详细信息输出来8.4 必须抓住异常的场合1、对于某些程序,例如前面讨论过的整数除零的程序,即使不加try、catch,编译一样通过,只是在运行的时侯会出错。但是很多时候,程序中必须要有try、catch,否则编译不通过, 如: public class Ex2public static void main(String args) System.out.println(program starts);try System.in.read();catch(Exception e) System.out.println(program ends);语句System.in.read( )的功能是让程序暂停一下,等待用户从键盘输入一个字符,若你没有输入,那么程序就一直等待,直到你按任意键一旦去掉try和catch,程序在编译的时侯就会出错,通过错误信息,我们可以看出对于语句System.in.read( ),必须要对他捕获IOException异常。为什么呢?方法read( )在定义的时侯被定义为:public abstract int read( ) throws IOExceptionJava规定,若一个方法在定义时抛出(throws)异常,而此异常不是RuntimeException,那么在调用这个方法的时侯,必须把它放在try中,即使在catch中不作任何处理。对于上面的程序的另一种写法:public class Ex4 public static void main(String args) throws Exception System.out.println(program starts); System.in.read(); System.out.println(program ends); 2、创建自己的异常类 用户定义异常是通过扩展Exception类来创建的。这种异常类可以包含一个“普通”类所包含的任何东西。下面就是一个用户定义异常类例子,它包含一个构造函数、几个变量以及方法:public class ServerTimedOutException extends Exception private String reason;private int port;public ServerTimedOutException ( String reason , int port ) this.reason = reason;this.port = port; public String getReason() return reason;public int getPort() return port; 使用语句来抛出已经创建的异常:throw new ServerTimedOutException (Could not connect, 80);实例: 考虑一个客户服务器程序。在客户代码中,要与服务器连接,并希望服务器在5秒钟内响应。如果服务器没有响应,那么,代码就如下所述抛出一个异常(如一个用户定义的ServerTimedOutException)。public void connectMe ( String serverName ) throws ServerTimedOutExceptionint success;int portToConnect = 80;success = open ( serverName , portToConnect );if (success = -1) throw new ServerTimedOutException( Could not connect, 80 ); 要捕获异常,使用try语句:public void findServer( ) . . .try connectMe (defaultServer); catch (ServerTimedOutException e ) System.out.println(Server timed out, trying alternate);try connectMe( alternateServer ); catch (ServerTimedOutException e1 )System.out.println(No server currently available);. . 注意:try和catch块可以如前例所述那样被嵌套。Exampleclass ServerTimedOutException extends Exception private String reason;private int port;public ServerTimedOutException ( String reason , int port ) this.reason = reason;this.port = port; public String getReason() return reason;public int getPort() return port; public class testpublic static void main( String a) test cc = new test();trycc.connectMe( );catch( Exception e0)trycc.connectMe();catch(ServerTimedOutException e1)System.out.println(e1.getReason();System.out.println(e1.getPort();public void connectMe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030餐饮SaaS行业解决方案分析及数字化渗透与天使轮融资评估报告
- 2025-2030食品电商平台用户画像与精准营销策略优化分析报告
- 2025四川南充市阆中市引进“带编入企”人才考核招聘8人备考考试题库附答案解析
- 2025青岛城鑫控股集团有限公司招聘计划备考考试题库附答案解析
- 2025江苏宿迁洋河新区招聘交通协管1备考考试题库附答案解析
- 2025年黑河嫩江市就业服务中心公开招聘公益性岗位就业人员104人考试模拟试题及答案解析
- 2025年临沂工学院(筹)公开招聘专任教师、行政教辅人员(130人)考试模拟试题及答案解析
- 2025吉林大学白求恩第一医院手足外科技师招聘1人备考考试试题及答案解析
- 2025湖北襄阳市中西医结合医院(襄阳市东风人民医院)招聘急需专业技术人才16人考试参考题库及答案解析
- 2025中石化芜湖石油分公司招聘3人备考考试题库附答案解析
- 廉政协议合同协议
- 加油站安全生产规章制度与岗位操作规程全套
- 运动生理学知到课后答案智慧树章节测试答案2025年春湖南师范大学
- 第四代住宅白皮书-HZS
- 工业机器人操作与编程实训任务题库参考答案
- TCCTAS 162-2024 公路中央分隔带组合型波形梁护栏技术规程
- 商场全套安全生产管理制度
- 《教育系统重大事故隐患判定指南》知识培训(三)
- 员工终端安全培训
- 【五年级】语文上册课课练
- 公路工程质量控制要点及质量通病防治手册
评论
0/150
提交评论