




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
清华大学出版社JavaEE基础教程 第 7章 异常7.1 异常的处理机制7.2 异常的处理7.3 自定义异常异常是程序运行过程中产生的错误。比如在进行除法运算时,如果除数为 0,则运行时 Java会自动抛出一个算术异常,它会中断程序的正常运行,如果不对它进行处理,有时会产生严重的后果。例如:在转账过程中,将钱从一个账户转到另一个账户时,如果钱已经从一个账户转出,在转到另一个账户的过程中出现异常,程序被迫中止。此时,用户就会损失这笔钱。Date 2 Java EE基础教程7.1 异常的处理机制7.1 异常的处理机制在 Java语言中,通过异常处理机制为程序提供错误处理的能力。根据这个处理机制,对程序运行时可能遇到的异常情况,预先提供一些处理的方法。在程序执行代码的时候,一旦发生异常,程序会根据预定的处理方法对异常进行处理,异常处理完毕后,程序继续运行。Java异常处理机制通过 5个关键字进行控制: try、 catch、 throw、throws和 finally。下面阐述系统如何通过这 5个关键字对异常进行处理。程序将必须监控异常的语句包含在 try块中。如果在 try块中发生异常,程序将引发一个异常,通过使用 catch关键字,系统捕获异常,并将处理该异常的代码写在 catch块中。在 finally块中,可以指定在程序结束之前必须执行的代码,无论异常是否发生,这段代码一定会被执行。异常的引发可以有自动和手动两种方法,如果需要手动产生异常,可以通过使用 throw关键字来实现。 throws关键字出现在方法的声明中,标识调用该方法可能抛出的各种异常。返回Date 3 Java EE基础教程7.2.1 Java内置异常为了处理一些常见的异常, Java语言中提供了一些内置的异常类供我们使用。这些类都继承自java.lang.Throwable类,而 Throwable类又继承自 Object类。 Throwable类有两个重要的子类: Error类和 Exception类。它们分别用来处理两种类型的异常 。Error类及其子类通常用来描述 Java运行时的内部错误,比如:在读取磁盘上的文件时,磁盘的扇区出现了损坏;从软盘中读取文件数据时,软驱中没有放入软盘。 Error类又称为致命异常类,该类表示的异常是比较严重的异常,一旦发生该类型的异常,通过修改程序代码是不能恢复程序的正常运行的。在一般情况下,发生该异常后,程序应该马上终止 。 7.2 异常的处理 返回Date 4 Java EE基础教程Exception类及其子类代表另一种类型的异常。该类用于用户程序可以捕获的异常情况。通过捕获和处理产生的异常,可以恢复程序的正常运行。该类有一个重要的子类RuntimeException,又称为运行时异常。在程序中出现除数为 0的运算、数组下标越界等情况时,都会引发该类型的异常。 Date 5 Java EE基础教程Java语言中规定 :只有 Throwable、 Error、 Exception类及其派生类的实例, Java运行时系统才将它识别为系统异常。表 7-1中列出了一些常用的异常类及其用途。 下面简单介绍常见的异常类,其他异常类将在后面的章节中陆续介绍。1) ArithmeticException类该类用于描述算术异常,比如当除数为 0时,会抛出该异常。int result=8 /0 ; / 除数为 0,抛出ArithmeticException异常2) NullPointerException类用来描述空指针异常,当引用的对象是 null时,如果试图通过 “.”操作符访问该对象的成员时,会抛出该异常。String str=null;int len=str.length(); /因为 str为 null对象,不能调用它的length()方法 。Date 6 Java EE基础教程3) ArrayIndexOutOfBoundException类该类用来描述数组下标越界时出现的异常 。float arr=new float4;arr4=9; /数组的最大下标是 3,而此处的 4超过了该值4) NubmerFormatException类该类用于描述字符串转换为数字时的异常 。String str=”23U”;double d=Double.parseDouble(str); /“23U”不能转换为 double类型的数 Date 7 Java EE基础教程7.2.2 try和 catch语句在 Java语言中,对容易引发异常的代码,可通过 try catch语句捕获。在 try语句块中编写可能引发异常的代码,然后在 catch语句块中捕获这些异常,并进行相应的处理。 try catch语句块的语法格式如下 :try可能产生异常的代码catch(异常类 1 异常对象 1)异常处理代码段 1catch(异常类 2 异常对象 2)异常处理代码段 2catch(异常类 n 异常对象 n)异常处理代码段 nDate 8 Java EE基础教程try语句块中的代码执行后可能同时产生多种异常,程序捕获哪一种类型的异常,是由 catch语句中的 “异常类 ”参数指定 。catch语句类似于方法的声明,包含一个异常类型和该类型的一个对象,通过在 catch块中调用该对象的方法可以获取该异常的详细信息。代码中的每个 catch语句块都用来捕获一种类型的异常。如果 try语句块中的代码执行时发生异常 ,则会由上而下依次查找能捕获该异常的 catch语句块,并执行该 catch语句块中的代码。 Date 9 Java EE基础教程例 7-1 根据输入的总分和人数,计算平均成绩程序清单: ch07ComputeAvg.javaimport java.util.InputMismatchException;import java.util.Scanner;public class ComputeAvg public static void main(String args) int score,num; double avg;Scanner in=new Scanner(System.in);trySystem.out.println(“请输入总分 : “);score=in.nextInt(); /ASystem.out.println(“请输入人数 : “);num=in.nextInt(); /Bavg=score/num; /CSystem.out.println(“平均成绩为: “+avg);catch(InputMismatchException e1)System.out.println(“输入不是数字 ! “);catch(ArithmeticException e2)System.out.println(“人数不能为 0“);catch(Exception e3)System.out.println(“其他异常 : “); Date 10 Java EE基础教程以上介绍了如何使用 try catch结构实现异常处理。在使用该结构时,还必须注意以下几点 :1) catch块一定要与 try块一起使用,不能够单独使用 catch块。2)一个 try块可以有多个 catch块。但是,多个 catch块的排列顺序必须是从特殊到一般,最后一个一般是 Exception类。3)如果不发生异常, catch块永远不会被执行。4)一旦某个 catch块被执行后,其他 catch块都会被忽略。5) trycatch 结构可以嵌套使用Date 11 Java EE基础教程7.2.3 throw语句前面介绍了如何获取并处理被 Java运行时系统抛出的异常。那么,用户可以显式地在程序中手动引发异常吗 ?答案是可以的,通过使用 Java异常处理机制提供的 throw关键字主动地抛出异常。 throw语句的语法结构如下 :throw 异常类的实例程序在执行到 throw语句时,首先检查它所在层的 try块 ,是否有一个 catch子句与该实例的类型匹配。如果找到匹配的,则程序的控制权转移到该语句块。如果没有找到匹配的,再检查上一层的 catch语句块,直到执行到最外层的 catch块。如果一直找不到相应的异常处理代码,则程序的控制权将交还给系统,程序将停止运行。 Date 12 Java EE基础教程例 7-2 定义一个方法 check(),检查输入的商品数是否大于 0,如果小于 0就抛出异常。 然后在主函数中调用该方法 。程序清单: ch07checkDemo.javaimport java.util.Scanner;public class checkDemo public static void check()Scanner in=new Scanner(System.in);System.out.println(“请输入商品的书目 : “);int num=in.nextInt();if(num0)throw new NumberFormatException(“商品书目不能小于 0! “);elseSystem.out.println(“商品数目为: “+num);Date 13 Java EE基础教程public static void main(String args) try check(); catch (Exception e) System.out.println(“异常: “+e.getMessage();程序的运行结果如下 。请输入商品的书目 :-3异常:商品书目不能小于 0! Date 14 Java EE基础教程7.2.4 throws语句若某个方法可能会产生异常,但不想在当前方法中处理该异常,那么可以将该异常抛出,然后在调用该方法的代码中捕获并处理该异常 。为了实现该功能,可以使用 Java语言提供的 throws关键字实现该功能。 throws关键字写在方法声明的后面,用来指定该方法可能抛出的异常,多个异常之间用逗号隔开 。例 7-3 定义一个方法 test(),该方法可能抛出两种类型的异常,然后在主函数中调用该方法 ,并处理可能出现的这些异常 。Date 15 Java EE基础教程程序清单: ch07throwsDemo.javaimport java.io.IOException;import java.util.Scanner;public class throwsDemo public static void test() throws NullPointerException,IOExceptionSystem.out.println(“请输入一个数字( 0, 1): “);Scanner in=new Scanner(System.in);int flag=in.nextInt();if(flag=1)throw new NullPointerException(); Date 16 Java EE基础教程elsethrow new IOException();public static void main(String args) try test(); catch (NullPointerException e) System.out.println(“系统抛出了 “+e.getClass()+“类型的异常 “); catch (IOException e) System.out.println(“系统抛出了 “+e.getClass()+“类型的异常 “);程序运行后,如果输入 “1”,方法 test()抛出了 NullPointerException类型的异常,程序的输出结果如下所示 :请输入一个数字( 0, 1):1系统抛出了 class java.lang.NullPointerException类型的异常 Date 17 Java EE基础教程7.2.5 finally语句在编写异常处理代码时,无论 try块中是否有异常抛出,都有一些工作必须在 try语句正常结束或者出现异常后进行的,比如对 try块中所调用资源的回收工作。 finally语句块可以包含一些无论程序是否正常运行都必须执行的一些语句。该子句是可选的 ,但是每个 try语句块应该至少有一个 catch语句块或finally语句块 。 Date 18 Java EE基础教程7.3 自定义异常通常使用 Java内置的异常类型可以描述在编写程序时出现的大部分异常情况,但根据需要,有时候需要创建自己的异常类,用来描述编程过程中遇到的一些特殊情况。下面就来介绍一下如何创建和使用自定义的异常类。自定义异常类时,它必须派生自 Throwable类及其子类。一般情况下,用户自定义异常类应该继承自 Exception类。这样,可以使用 Exception类中的所有方法。在程序中定义和使用自定义异常类,一般可分为以下几个步骤:返回Date 19 Java EE基础教程v ( 1)创建派生自 Exception类或其子类的自定义异常类v ( 2)在方法中通过 throw语句抛出自定义的异常类对象v ( 3)如果在当前抛出异常的方法中处理异常,可以使用trycatchv 语句块捕获并处理该异常;否则在方法声明处通过throws语句v 指明方法可能抛出的异常。v ( 4)在调用由 throws语句声明的方法时,在调用方法的代码中,捕获v 并处理自定义的异常类对象。Date 20 Java EE基础教程例 7-4 创建一个自定义异常类,个性化处理除数为 0的情况。程序清单: ch07ExceptionTest.javaimport java.util.Scanner;class MyException extends Exception /继承 Exception类private String myString;public MyException(String myString) this.myString = myString; public String getMyString() return myString;Overridepublic String toString() /重写了类的方法return myString; public class ExceptionTest public static void main(String args) double i,j;Scanner scan=new Scanner(System.in);System.out.println(“请输入分子 :“);i=scan.nextDouble();Date 21 Java EE基础教程System.out.println(“请输入分母 “);j=scan.nextDouble();try if(j=0) /判断分母的值throw new MyException(“除数不能零 ! “); /AelseSystem.out.println(“分数值为: “+i+“/“+j+“=“+(i/j); catch (MyException e) System.out.println(e); Date 22 Java EE基础教程该程序代码定义了一个继承 Exception类的自定义异常类MyException。在这个类中,定义了一个字符串成员,重写了 toString()方法,个性化输出自定义的错误信息。然后在测试类中输入了两个数,如果第二个数为 0,则在代码行 A处抛出带有自定义错误信息的异常对象,然后在 catch块中对上述抛出异常。程序的运行结果如下 :请输入分子 :3请输入分母0除数不能零 ! Date 23 Java EE基础教程The EndDate 24 Java EE基础教程清华大学出版社JavaEE基础教程 第 8章 输入输出流8.1 获取文件和目录的属性8.2 Java中的 I/O流8.3 字节流8.4 字符流通过允许程序读取文件的内容或者向文件中写入内容,可以使程序的开发更加灵活。要从文件、内存或网络读取信息,程序必须打开源的一个流;同样,通过打开至目标的一个流,并按顺序写入信息,程序可以向文件写入信息。 Date 26 Java EE基础教程8.1 获取文件和目录的属性在 Java语言中,提供了获取和修改文件 /目录属性的类java.io.File。 File类的使用是与平台无关的,适用于不同的文件系统。在程序中,通过创建 File类的对象来代表一个文件或目录,利用这个对象可以对文件或目录的属性进行有关操作。表 8-1列举了 File类的主要方法和说明。 返回Date 27 Java EE基础教程例 8-1对文件和目录的操作程序清单: ch08FileAndDirectoryTest.javaimport java.io.File;public class FileAndDirectoryTest public static void main(String args) String filename=“testFile“;File f1=new File(filename); /ASystem.out.println(filename+“是否存在: “+f1.exists();System.out.println(filename+“是文件吗: “+f1.isFile();System.out.println(filename+“最后修改时间: “+f1.lastModified();System.out.println(filename+“文件大小: “+f1.length();String direname=“testDire“;File f2=new File(direname); /BSystem.out.println(direname+“的绝对路径: “+f2.getAbsolutePath();if(f2.isDirectory() /CString fileList=f2.list(); /DSystem.out.println(direname+“目录中的文件和目录包括: “);for(int i=0;ifileList.length;i+)System.out.print(fileListi+” ”); Date 28 Java EE基础教程运行此程序前,在当前源程序所在的目录下创
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新国航安全员面试题及答案
- 2025年汽车维修技术高级工程师考试试题及答案解析
- 外贸销售合同4篇
- 农产品电商溯源体系构建-洞察及研究
- 跨界竞争壁垒突破-洞察及研究
- 安全素养考试题及答案
- 高利合同模板(3篇)
- 安徽会计基础试题及答案
- 汽车维修居间代理合同范本
- 公路建设项目终止及赔偿责任协议范本
- 黄冈市2025年高三年级9月调研考试(一模)生物试卷(含答案)
- 安徽省合肥市六校联考2025-2026年高三上学期开学考试语文试卷(含答案)
- 2025债权收购委托代理合同
- 框架合作协议书合同模板
- 2025年辅警招聘考试试题库(附答案)(满分必刷)
- 热处理安全培训考试试题及答案解析
- 2025年北京市中考英语真题卷含答案解析
- 制鞋工岗前考核试卷及答案
- (2025年标准)课时合同转让协议书
- 郑州市突发应急预案
- 2025广东肇庆市怀集县卫生事业单位招聘102人考试备考试题及答案解析
评论
0/150
提交评论