• 1. 异常处理(上)
  • 2. 本节主要内容异常概述 Java异常的层次关系 捕获异常
  • 3. 异常不要指望你的程序永远不会出错.作为程序设计人员,尽可能的将程序设计的键壮,不要等出来问题再去解决 Java程序运行过程中所发生的异常事件可分为两类: 错误(Error):JVM系统内部错误、资源耗尽等严重情况,对于这类情况,程序基本上是无能为力. 异常(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,对于这种情况,可以用Java提供的Exception机制进行处理.例如: 对负数开平方根 空指针访问 试图读取不存在的文件 网络连接中断
  • 4. 异常例子public class ExceptionTest { public static void main(String args[]){ int a = 12,b =0; int d ; d = a / b ; System.out.println( a +"/" + b +" = " + d ); } } 代码参见案例:13-1 除0异常
  • 5. 异常例子public class ExceptionExam1 { public static void main(String args[]) { java.util.Date d = null; System.out.println(d.getTime()); } } 参见案例:13-2 空指针异常
  • 6. Error/Exception层次图ThrowableErrorExceptionEOFExceptionFileNotFoundException… …AWTErrorVirtualMachineErrorArithmeticExceptionNullPointerExceptionLinkageError… …IOExceptionRuntimeException… …ThreadDeath
  • 7. Exception的层次关系Exception的子类很多,大致可以分为三类,有关IO的IOException,有关运行时异常的RuntimeException,以及其他的异常 IOException是由于IO系统堵塞等原因引起的异常,包括 (1) 试图从文件结尾处读取信息 (2) 试图打开一个不存在或者格式错误的url RuntimeException是由于程序编写过程中不周全而引起的,包括 (1) 错误的类型转换 (2) 数组越界访问 (3) 数字计算错误 (4) 试图访问一个空对象 其他异常 (1) 用Class.forName()来初始化一个类的时候,字符串参数或对应的类 不存在 (2) 其他
  • 8. 常见异常RuntimeException ArithmeticException:数学计算异常 NullPointerException:空指针异常 NegativeArraySizeException:负数组长度异常 ArrayOutOfBoundsException:数组索引越界异常 ClassNotFoundException:类文件未找到异常 ClassCastException:造型异常 IOException FileNotFoundException:文件未找到异常 EOFException:读写文件尾异常 MalformedURLException:URL格式错误异常 SocketException:Socket异常
  • 9. 访问文件异常有些程序在编制的过程中,如果没有处理一次会,编译器会强制我们进行异常处理 FileInputStream in = new FileInputStream("c:/a.txt"); int b; b = in.read(); while (b != -1) { System.out.print((char) b); b = in.read(); } in.close(); 代码参见案例13-3 读取文件异常
  • 10. 运行时异常/已检查异常Java语言规范中讲Error的子类和RuntimeException的子类都称为运行时异常.这类异常的特点是:Java编译器不会检查他们(所以也称为未检查异常),编译不会除错.只有在程序运行是才发生异常 将除RuntimeException类之外的异常类等称为已检查异常.这类异常的特定是:java编译器会检查他们.如果在程序中出现这类异常而没有处理的化,Java编译器会编译出错 对于RuntimeException,是可以通过编程将这种异常避免.例如:对操作数进行判断,就可以避免出现除0的异常;对数组的长度进行判断,就可以避免数组索引越界的异常. 对于已检查异常,要在程序中通过try/catch进行捕获或通过throws在方法声明的时候将异常抛出. 代码参见案例:13-4 避免未检查异常
  • 11. Java异常处理机制Java程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。 当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。 如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。 程序员通常只能处理违例(Exception),而对错误(Error)无能为力。
  • 12. 异常处理的try-catch-finally语句try{ // 可能会抛出特定异常的代码段 }catch(MyExceptionType myException){ // 如果myException 被抛出,则执行这段代码 }catch(Exception otherException){ //如果另外的异常otherException被抛出,则执行这段代码 } [finally{ //无条件执行的语句 }]
  • 13. try-catch-finallytry—将可能出现异常的代码都放在try代码块中,当然,也可以将其他的一些不会引起异常的代码也一并放到try代码块中 catch 从句中引入一个可能出现的异常,一个try块可以和多个catch块配合以处理多个异常. 通过catch捕获多个异常的时候,如果这些异常之间有基础关系,就应该把子类的异常放在前面进行捕获 当try块内的任何代码抛出了由catch 子句指定的异常,则try代码端中的程序将会终止执行,并跳到相应的catch代码块中来执行 无论是否出现异常,程序最后都会执行finally代码块中的内容 用try/catch捕获和处理的异常是已检查的异常.而未检查异常不能用try/catch捕获,而是通过编程的方法尽量避免
  • 14. 捕获异常例子import java.io.*; public class CatchException{ public static void main(String[] args){ try{ FileInputStream fis = new FileInputStream("c:\\a.txt"); int b; b = fis.read(); while(b!= -1){ System.out.print((char)b); b = fis.read(); } fis.close(); } catch(FileNotFoundException e){ System.out.println("FileNotFoundException:"+e.getMessage()); } catch(IOException e1){ System.out.println("IOException:"+e1.getMessage()); } } } 代码参见案例:13-5 处理文件读取异常
  • 15. 注意千万不要对捕获的异常“不作为”,也就是说,不要让catch()语句中的代码是空的 try{ ….. }catch (FileNotFoundException e) { }
  • 16. try/catch与return语句 try{ … } catch (FileNotFoundException e) { System.err.println("没有找到文件"); return; //System.exit(1); } finally{ …. } 代码参见案例:13-6 finally与return