《java异常处理与输入输出流简介》由会员分享,可在线阅读,更多相关《java异常处理与输入输出流简介(78页珍藏版)》请在金锄头文库上搜索。
1、第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异常是描述在代码段中发生的运行出错 情况的对象。程序中的错误可能来自于编译 错误和运行错
2、误。编译错误是由于所编写的 程序存在语法问题,未能通过由源代码到目 标代码的编译过程而产生的错误,它将由语 言的编译系统负责检测和报告;运行错误是 在程序的运行过程中产生的错误。 8.1.1 什么是异常 在程序执行中,任何中断正常程序流程的异常条件就 是错误或异常。 第一种,Java 虚拟机检测到了非正常的执行状态, 这些状态可能是由以下几种情况引起的: 表达式的计算违反了Java 语言的语义,例如整数 被0 除。 在载入或链接Java 程序时出错。 超出了某些资源限制,例如使用了太多的内存。 第二种,Java 程序代码中的throw 语句被执行。 第三种,异步异常发生。异步异常的原因可能有:
3、 Thread 的stop 方法被调用。 Java 虚拟机内部错误发生。8.1.2 异常处理机制 Java异常处理是通过5个关键字来管理的。它们是try 、catch、throw、throws和finally。 程序里,需要被监测的程序语句序列应包含在一个 try代码块中。如果try代码块中有异常发生,那么就 要抛出该异常。可以用catch来捕获这个异常,并且 在catch块中加以适当地处理。系统产生的异常会由 Java运行时系统自动抛出。如果要手动抛出异常,则 使用关键字throw。在一些情况下,从一个方法抛出 的异常必须用一个throws语句指定为异常。最后,从 try代码块退出时,必须执
4、行的代码要放在一个finally 代码块中。 8.1.3 异常分类 Java中的异常类具有层次组织,其中 Throwable类是Error类(错误类)和Exception 类(异常类)的父类,Throwable是Object的 直接子类。 异常类(java.lang.Exception)继承于 java.lang.Object中的java.lang.Throwable类。 异常可分为执行异常(RuntimeException)和 检查异常(Checked Exceptions)两种。 异常类的继承结构 ThrowableErrorExceptionObjectAWTExceptionRunti
5、meExceptionIOException1执行异常即运行时异常,继承于RuntimeException。Java编译器允许程序不 做处理。 ArithmeticException:一个不寻常算术运算产生的异常。 ArrayStoreException:存入数组的内容数据类型不一致所产生的异 常。 ArrayIndexOutOfBoundsException:数组索引超出范围所产生的异 常。 ClassCastExcption:类对象强迫转换造成不当类对象所产生的异常 。 NumberFormatException:字符串转换数值所产生的异常。 IndexOutOfBoundsExcepti
6、on:索引超出范围所产生的异常。 NegativeException:数组建立负值索引所产生的异常。 NullPointerException:对象引用参考值为null所产生的异常。2检查异常除了执行异常外,其余的子类是属于检查异常类也称为非运行时异常,它们都在 java.lang类库内定义。Java编译器要求程序必须捕获或者声明 抛弃这种异常。 ClassNotFoundException:找不到类或接口所产生的异常。 CloneNotSupportedException:使用对象的clone方法但无法执 行Cloneable所产生的异常。 IllegaAccessException:类定义
7、不明确所产生的异常。 InstantiationException:使用newInstance方法试图建立一个类 instance时所产生的异常。 InterruptedException:目前线程等待执行,另一线程中断目前 线程所产生的异常。 8.1.4 错误分类Error类与异常一样,它们都是继承自 java.lang.Throwable类。Error 类对象 由 Java 虚拟机生成并抛出。Error类包括 linkageError(结合错误)与 VitualmachineError(虚拟机错误)两种 子类。LinkageError 的子类表示一个类依赖于另一个类,但是, 在前一个类编译
8、之后, 后一个类的改变会与它不兼容。 ClassFormarErro:类格式所产生的错误。 ClassCircularityError:无限循所产生的错误。 ExceptionInInitializerError:初始化所产生的错误。 NoClassDeFormatError:没有类定义所产生的错误。 VeritfyError:类文件某些数据不一致或安全问题所产生的错误。 UnsatisfidLinkError:Java虚拟机无法找到合适的原始语言(native-language) 定义的方法所产生的错误。 IncompatibleClassChangeError:不兼容类所产生的错误。 Ab
9、tractMethodError:调用抽象方法所产生的错误。 NoSuchFieldError:存取或改变数据域所产生的错误。 NoSchMethodError :调用类方法所产生的错误。 IllegalAccessError:不合法存取或改变数据域或调用方法所产生的错误。 InstantionError:使用抽象类或接口所产生的错误。1linkageError当Java虚拟机崩溃了或用尽了它继续操作所需的 资源时,抛出该错误。 VitualmachineError包含InternalError, OutOfMemoryError ,StackOverflow- Error, UnknownE
10、rror。这些类所代表的意义: InternalError:虚拟机内部所产生的错误。 OutOfMemoryError:虚拟机内存不足所产生的错误 。 StackOverflowError:堆栈无法容纳所产生的错误。 UnknownError:虚拟机不知名异常所产生的错误。 2VitualmachineError8.2 Java异常的处理方法 当发生Exception时,那么,在编写程序时可以采 取的措施: 通过将trycatch()块纳入其代码中, 在这里捕获被命名为属于某个超类的异常,并调用 方法处理它。 让被调用的方法表示它将不处理异常,将该异 常抛到它所遇到的调用方法中。这用throw
11、s子句实 现。 使用throws子句标记调用方法的声明如下所示: public void troublesome() throws Exception 其中,关键字throws之后是所有异常的列表,方法 可以将它们抛回到它的调用程序中。 1try/catch try/catch异常处理代码块的基本形式:try /监视 可能发生异常的代码块; catch(异常类型 异常对象名)/捕获并处理异常 异常处理代码块; 当抛出一个异常时,异常会由相应的catch语句捕获并处理。与一 个try相关的catch语句可以有多个,构成多重catch 语句,异常类 型决定了要执行哪个catch语句。 如果没有抛出
12、异常,那么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可嵌入的tr
13、y块一个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 =
14、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); caculat
15、e(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位字符流的类