资源预览内容
第1页 / 共78页
第2页 / 共78页
第3页 / 共78页
第4页 / 共78页
第5页 / 共78页
第6页 / 共78页
第7页 / 共78页
第8页 / 共78页
第9页 / 共78页
第10页 / 共78页
亲,该文档总共78页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8讲 Java异常处理及输入输出流简介 n8.1 异常处理概述 n8.2 Java异常的处理方法 n8.3 Java数据流概述和java.io包 n8.4 File类 n8.5文件输入与输出 n8.6标准输入和输出本章要点l了解异常和异常分类l理解Java异常处理机制和异常类。l掌握try/catch/ finally语句处理异常的方式以及如何 声明异常。l了解自定义异常。 l理解Java语言中数据流的概念l掌握各种常用的输入输出流类l掌握各种文件操作类,l了解流类的继承关系8.1 异常处理概述 Java异常是描述在代码段中发生的运行出错 情况的对象。程序中的错误可能来自于编译 错误和运行错误。编译错误是由于所编写的 程序存在语法问题,未能通过由源代码到目 标代码的编译过程而产生的错误,它将由语 言的编译系统负责检测和报告;运行错误是 在程序的运行过程中产生的错误。 8.1.1 什么是异常 在程序执行中,任何中断正常程序流程的异常条件就 是错误或异常。 第一种,Java 虚拟机检测到了非正常的执行状态, 这些状态可能是由以下几种情况引起的: 表达式的计算违反了Java 语言的语义,例如整数 被0 除。 在载入或链接Java 程序时出错。 超出了某些资源限制,例如使用了太多的内存。 第二种,Java 程序代码中的throw 语句被执行。 第三种,异步异常发生。异步异常的原因可能有: Thread 的stop 方法被调用。 Java 虚拟机内部错误发生。8.1.2 异常处理机制 Java异常处理是通过5个关键字来管理的。它们是try 、catch、throw、throws和finally。 程序里,需要被监测的程序语句序列应包含在一个 try代码块中。如果try代码块中有异常发生,那么就 要抛出该异常。可以用catch来捕获这个异常,并且 在catch块中加以适当地处理。系统产生的异常会由 Java运行时系统自动抛出。如果要手动抛出异常,则 使用关键字throw。在一些情况下,从一个方法抛出 的异常必须用一个throws语句指定为异常。最后,从 try代码块退出时,必须执行的代码要放在一个finally 代码块中。 8.1.3 异常分类 Java中的异常类具有层次组织,其中 Throwable类是Error类(错误类)和Exception 类(异常类)的父类,Throwable是Object的 直接子类。 异常类(java.lang.Exception)继承于 java.lang.Object中的java.lang.Throwable类。 异常可分为执行异常(RuntimeException)和 检查异常(Checked Exceptions)两种。 异常类的继承结构 ThrowableErrorExceptionObjectAWTExceptionRuntimeExceptionIOException1执行异常即运行时异常,继承于RuntimeException。Java编译器允许程序不 做处理。 ArithmeticException:一个不寻常算术运算产生的异常。 ArrayStoreException:存入数组的内容数据类型不一致所产生的异 常。 ArrayIndexOutOfBoundsException:数组索引超出范围所产生的异 常。 ClassCastExcption:类对象强迫转换造成不当类对象所产生的异常 。 NumberFormatException:字符串转换数值所产生的异常。 IndexOutOfBoundsException:索引超出范围所产生的异常。 NegativeException:数组建立负值索引所产生的异常。 NullPointerException:对象引用参考值为null所产生的异常。2检查异常除了执行异常外,其余的子类是属于检查异常类也称为非运行时异常,它们都在 java.lang类库内定义。Java编译器要求程序必须捕获或者声明 抛弃这种异常。 ClassNotFoundException:找不到类或接口所产生的异常。 CloneNotSupportedException:使用对象的clone方法但无法执 行Cloneable所产生的异常。 IllegaAccessException:类定义不明确所产生的异常。 InstantiationException:使用newInstance方法试图建立一个类 instance时所产生的异常。 InterruptedException:目前线程等待执行,另一线程中断目前 线程所产生的异常。 8.1.4 错误分类Error类与异常一样,它们都是继承自 java.lang.Throwable类。Error 类对象 由 Java 虚拟机生成并抛出。Error类包括 linkageError(结合错误)与 VitualmachineError(虚拟机错误)两种 子类。LinkageError 的子类表示一个类依赖于另一个类,但是, 在前一个类编译之后, 后一个类的改变会与它不兼容。 ClassFormarErro:类格式所产生的错误。 ClassCircularityError:无限循所产生的错误。 ExceptionInInitializerError:初始化所产生的错误。 NoClassDeFormatError:没有类定义所产生的错误。 VeritfyError:类文件某些数据不一致或安全问题所产生的错误。 UnsatisfidLinkError:Java虚拟机无法找到合适的原始语言(native-language) 定义的方法所产生的错误。 IncompatibleClassChangeError:不兼容类所产生的错误。 AbtractMethodError:调用抽象方法所产生的错误。 NoSuchFieldError:存取或改变数据域所产生的错误。 NoSchMethodError :调用类方法所产生的错误。 IllegalAccessError:不合法存取或改变数据域或调用方法所产生的错误。 InstantionError:使用抽象类或接口所产生的错误。1linkageError当Java虚拟机崩溃了或用尽了它继续操作所需的 资源时,抛出该错误。 VitualmachineError包含InternalError, OutOfMemoryError ,StackOverflow- Error, UnknownError。这些类所代表的意义: InternalError:虚拟机内部所产生的错误。 OutOfMemoryError:虚拟机内存不足所产生的错误 。 StackOverflowError:堆栈无法容纳所产生的错误。 UnknownError:虚拟机不知名异常所产生的错误。 2VitualmachineError8.2 Java异常的处理方法 当发生Exception时,那么,在编写程序时可以采 取的措施: 通过将trycatch()块纳入其代码中, 在这里捕获被命名为属于某个超类的异常,并调用 方法处理它。 让被调用的方法表示它将不处理异常,将该异 常抛到它所遇到的调用方法中。这用throws子句实 现。 使用throws子句标记调用方法的声明如下所示: public void troublesome() throws Exception 其中,关键字throws之后是所有异常的列表,方法 可以将它们抛回到它的调用程序中。 1try/catch try/catch异常处理代码块的基本形式:try /监视 可能发生异常的代码块; catch(异常类型 异常对象名)/捕获并处理异常 异常处理代码块; 当抛出一个异常时,异常会由相应的catch语句捕获并处理。与一 个try相关的catch语句可以有多个,构成多重catch 语句,异常类 型决定了要执行哪个catch语句。 如果没有抛出异常,那么try代码块就会结束,并且会跳过它的所 有catch语句,从最后一个catch后面的第一个语句继续执行。 8.2.1 try/catch/finally public class ExceptionExam0 public static void main(String args) int i,a;try / 监视一代码块i=0;a=42/i; return; catch (ArithmeticException e) /捕获一个被零除异常 System.out.println(“被零除“); 例8.1使用try/catch进行异常处理的情况 。例8.1运行结果如图所示2可嵌入的try块一个try代码块可以嵌入到另一个try代 码块当中。由于内部try代码块产生的异 常如果没有被与该内部try代码块相关的 catch捕获,就会传到外部try代码块。 通常嵌入式try代码块用于以不同方式处 理不同类型的错误。某些类型的错误是致 命的,无法修改。某些错误则较轻,可以 马上处理。许多程序员在使用外部try代 码块捕获大部分严重错误的同时,让内部 try代码处理不太严重的错误。 public class ExceptionExam2 public static void main(String args) int data1 =2,4,6,8,10,12; int data2 =1,0,2,4,3; try for(int i=0;i“; public class ExceptionExam7 static void caculate(int a) throws ExceptionExam7_1 System.out.println(“对“+ a +“已经进行过相应的操作“); if(a100) throw new ExceptionExam7_1 (a);例8.6 自定义异常示例System.out.println(“执行该算法正常退出!“); public static void main(String args) try caculate(1); caculate(1000); catch (ExceptionExam7_1 e) System.out.println(“捕获了异常“ + e); 续例8.6运行结果如图所示8.3 Java数据流概述和java.io包 8.3.1 流的概念 所谓流是指同一台计算机或网络中不同计算 机之间有序运动着的数据序列。Java把这些 不同来源和目标的数据都统一抽象为数据流 。数据流可分为输入流和输出流。 流式输入输出的特点是数据的获取和发送沿 数据序列的顺序进行,即每一个数据都必须 等待排在它前面的数据,等前面的数据读入 或送出之后才能被读写。 8.3.2 java.io包Java语言中提供了比较完善的处理输入输出数据 的功能,实现这些I/O操作的类和接口都在java.io 包中。java.io包中提供了各种各样的输入输出流 类,它们都是Object类的直接子类,每一个流类 代表一种特定的输入或输出流。 基本输入流(InputStream)和基本输出流( OutputStream)是处理以8位字节为基本单位的 字节流类,读写以字节为单位进行;Reader和 Writer类是专门处理16位字符流的类
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号