08第八章异常处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5
3 Sept. 2008 Confidential
try块和catch块
•
catch块,是用来捕获并处理try块抛出的异常的 代码块。没有try块,catch块不能单独存在。我 们可以有多个catch块,以捕获不同类型的异常。
try{ try{ System.out.println(20/0); System.out.println(20/0); }catch(Exception e){ }catch(Exception e){ System.out.println(“除数不能为零”); System.out.println(“除数不能为零”); } }
•
FileTest5.java、ThrowDemo.java
3 Sept. 2008 Confidential
throws声明方法抛出异常
throws用来声明一个成员函数可能抛出的各种“异常” • 位置:函数头的后面 • FileTest.java
•
01 class ThrowsDemo{ 01 class ThrowsDemo{ 02 public static void proc( ) throws IOException{ 02 public static void proc( ) throws IOException{ 03 System.out.println("inside proc"); 03 System.out.println("inside proc"); 04 throw new IOException("ThrowsDemo"); 04 throw new IOException("ThrowsDemo"); 05 } 05 } 06 public static void main(String args[ ]){ 06 public static void main(String args[ ]){ 07 try{ 07 try{ 08 proc (); 08 proc (); 09 }catch(IOException e){ 09 }catch(IOException e){ 10 System.out.println("caught"+e); 10 System.out.println("caught"+e); 11 } 11 } 12 } 12 } 13 } 13 }
异常类型(续2)
3 Sept. 2008 Confidential
普通异常
•
ArithmeticException-整数被零除操作的结果:
int i = 12 / 0;
•
NullPointerException-试图访问一个没被实例化的 对象的属性或方法:
Date d = null; System.out.println(d.toString());
Java编程基础 ——异常处理
东软IT人才实训中心
Copyright 2008 By Neusoft Group. All rights reserved
第八章 异常处理
目标: Java中的异常处理机制。介绍 Java API中的异常有关类的继承关系 。方法调用的堆栈。Java异常处理的 抓抛模型。关键字finally和关键字 throws及throw。创建自定义异常类 。
•
二次抛出
catch(Exception e) { catch(Exception e) { System.out.println("一个异常已经产生"); System.out.println("一个异常已经产生"); throw e; throw e; } }
•
手动抛出
throw new IOException(); throw new IOException();
• •
NegativeArraySizeException-试图用负数作为维的 大小创建一个数组。 ArrayIndexOutofBoundsException-尝试访问的数组 元素超过数组大小。
3 Sept. 2008 Confidential
方法调用栈
• •
后进先出 MethodStack.java
3 Sept. 2008 Confidential
练习
写一个数组越界的访问,并捕捉此异常,在 异常处理中输出“数组越界”。并在finally 中判断是否有异常,然后输出“程序”+正常/ 异常+“运行结束”。
ModelExercise.java
3 Sept. 2008 Confidential
throw语句
异常类型(续1)
Object Object Throwable Throwable
Error Error
Exception Exception
RuntimeException RuntimeException
IOException IOException
3 Sept. 2008 Confidential
Array Index OutOf Bounds Exception
01 catch (ArrayIndexOutOfBoundsException e) {{ 01 catch (ArrayIndexOutOfBoundsException e) 02 System.out.println(“Out of Bounds!”); }} 02 System.out.println(“Out of Bounds!”); 03 catch (RuntimeException e) {{ 03 catch (RuntimeException e) 04 System.out.println(“Runtime Exception!”);} 04 System.out.println(“Runtime Exception!”);} 05 catch (Exception e) {{ 05 catch (Exception e) 06 System.out.println(“Exception!”); }} 06 System.out.println(“Exception!”);
try块 try块 无异常 finally块 finally块
通常在finally块中编写将资源返还给系统 通常在finally块中编写将资源返还给系统 的语句,它一般包括: 的语句,它一般包括: •释放动态分配的内存块 •释放动态分配的内存块 •关闭文件 •关闭文件 •关闭数据库结果集 •关闭数据库结果集 •关闭与数据库建立的连接 •关闭与数据库建立的连接
Test.java
public void methodThree(){ try{ System.out.println(arr[3]);
System.out.println("Three"); 19 } 20 catch(ArrayIndexOutOfBoundsException ex){ 21 System.out.println("catched"); 22 } 23 } 24 }
•
•
3 Sept. 2008 Confidential
异常类型
•
产生一个异常就是由系统(JVM)自动的实例化一 个异常类的对象。 – 称为抛出异常 异常的继承树 – 检查性异常(checked exception) – 非检查性异常(unchecked exception)
•
3 Sept. 2008 Confidential
methiodThree() methiodThree() methiodTwo() methiodTwo() methiodOne() methiodOne() main() main()
wk.baidu.com
3 Sept. 2008 Confidential
抛出异常对象
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 public class MethodStack{ int[] arr=new int[3]; public static void main(String[] args){ new MethodStack().methodOne(); System.out.println("main"); } public void methodOne(){ methodTwo(); System.out.println("One"); } public void methodTwo(){ methodThree(); System.out.println("Two"); Exception in thread "main" } java.lang.ArrayIndexOutOfBoundsException: public void methodThree(){ at Sample.methodThree(Sample.java:17) System.out.println(arr[3]); at Sample.methodTwo(Sample.java:13) System.out.println("Three"); Sample.methodOne(Sample.java:9) at } at Sample.main(Sample.java:5) } Press any key to continue...
学时:1.5学时 教学方法:讲授ppt +上机练习
3 Sept. 2008 Confidential
本章要点
• • • •
异常类的继承关系 抓抛模型 try-catch-finally关键字 throw和throws关键字
3 Sept. 2008 Confidential
异常简介
•
程序运行过程时都可能发生会打断程序正常执行的事件: – 如除数为零0、数组下标越界、文件找不到、内存不 足等 Java异常处理 – 利用面向对象的方法来处理异常 异常处理机制特点 – 异常处理允许一个程序捕获异常并处理异常,然后 继续执行程序。 – 它的构造保证错误情况下不会妨碍正常的程序流程。 – 当发生特殊情况时,它们在独立的代码块中处理, 与正常的执行代码相关联。
3 Sept. 2008 Confidential
throws声明方法抛出异常(续)
•
方法中如果抛出: – 非检查性异常:需要去除Bug,直到不抛出异常 – 检查性异常 • 使用 try-catch-finally 语句块处理异常 • 使用 throws 子句在代码产生异常的地方声明 FileTest2.java、FileTest3.java、 FileTest4.java
3 Sept. 2008 Confidential
if caught, do this…
if caught, do this…
捕获异常对象
01 02 03 public class Test{ int[] arr=new int[3]; public static void main(String[] args){ 04 new Test().methodOne(); 05 System.out.println("main"); 06 } 07 public void methodOne(){ 08 methodTwo(); 09 System.out.println("One"); 10 } 11 public void methodTwo(){ 12 methodThree(); 13 System.out.println("Two"); 14 } 15 16 17 18
3 Sept. 2008 Confidential
抓抛模型
Exception
如果程序抛出多个不同类 型的异常,我们需要多个 catch()语句来处理。 • 和特殊异常类相关联的 catch()块必须写在和 普通异常类相关联的 catch()之前。
•
if caught, do this…
Runtime Exception
3 Sept. 2008 Confidential
finally块
•
DoFinally.java
在try-catch之后存在finally 块,表示执行 try-catch块以后,无论有无抛出Exception, 最后必须执行finally块的代码。
发生异常 catch块 catch块 finally块 finally块