《JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 5JAVA》由会员分享,可在线阅读,更多相关《JAVA语言面向对象程序设计 教学课件 ppt 作者 马俊 ppt 5JAVA(26页珍藏版)》请在金锄头文库上搜索。
1、1,异常和垃圾收集,第五章,2,目标,了解异常的定义 了解异常的分类 掌握 try、catch 和 finally 语句的用法 掌握throw、throws子句的用法 掌握如何定义自己的异常 了解 Java 的垃圾收集机制,3,什么是异常,运行时发生的错误称为异常。处理这些异常就称为异常处理。 一旦引发异常,程序将突然中止,且控制将返回操作系统。 发生异常后此前分配的所有资源都将保留在相同的状态,这将导致资源漏洞。,4,Java异常处理基础,Java异常处理机制采用一个统一和相对简单的抛出和处理错误的机制。如果一个方法本身能引发异常,当所调用的方法出现异常时,调用者可以捕获异常使之得到处理;也
2、可以回避异常,这时异常将在调用的堆栈中向上传递,直到被处理。,5,异常体系结构,所有异常类型都是 内置类Throwable的子类,用于Java运行时系统 来显示与运行时系 统本身有关的错误,用于用户程序可能 捕获的异常,也是用来创建用户异常类型子类的类。,Error类对象由Java虚拟机生成并抛出; Exception类对象由应用程序处理或抛出。,6,常见异常及其用途 2-1,7,常见的异常及其用途 2-2,8,异常处理模型,由五个关键字 try、catch、throw、throws 和 finally 处理。 Java 中可用于处理异常的两种方式: 自行处理:可能引发异常的语句封入在 try
3、 块内,而处理异常的相应语句则封入在 catch 块内。 回避异常:在方法声明中包含 throws 子句,通知潜在调用者,如果发生了异常,必须由调用者处理。,9,try - catch 块示例,public class ExceptionDemo public static void main(String args) try int c= calculate(9,0); System.out.println(c); catch (Exception e) System.err.println(“发生异常: “ + e.toString(); e.printStackTrace(); stat
4、ic int calculate(int a, int b) int c = a/b; return c; ,调用函数calculate, 将引发一个异常,在catch块中处理异常,输出 结果,10,多个 catch 块,单个代码片段可能会引起多个错误。 可提供多个 catch 块分别处理各种异常类型。,. . . try catch(ArrayIndexOutOfBoundsException e) catch(Exception e) .,ArrayIndexOutOfBoundsException类为 Exception 类的子类,但是如果异常 属于ArrayIndexOutOfBoun
5、dsException类将执行第一个 catch 块,之后控制 将转向try/catch块之后的语句,所以始终不会执行第二个 catch 块。,11,多个 catch 块示例,class Catch22 public static void main(String args) try String num=args0; int numValue=Integer.parseInt(num); System.out.println(“平方为 “+numValue*numValue); catch(ArrayIndexOutOfBoundsException ne) System.out.print
6、ln(“未提供任何参数!“); catch(NumberFormatException nb) System.out.println(“不是数字!“); ,12,嵌套的 try - catch 块,有时,块的一部分引起一个错误,而整个块可能又引起另一个错误。在此情况下,需要将一个异常处理程序嵌套到另一个中。 在使用嵌套的try块时,将先执行内部 try 块,如果没有遇到匹配的 catch 块,则将检查外部 try 块的 catch 块。,13,finally 块,确保了在出现异常时所有清除工作都将得到处理 与 try 块一起使用 无论是否出现异常,finally块都将运行,14,finally
7、 块 示例,class FinallyDemo int no1,no2; FinallyDemo(String args) try no1 = Integer.parseInt(args0); no2 = Integer.parseInt(args1); System.out.println(“相除结果为 “+no1/no2); catch(ArithmeticException i) System.out.println(“不能除以 0“); finally System.out.println(“Finally 已执行“); public static void main(String a
8、rgs) new FinallyDemo(args); ,15,使用 throw,异常是通过关键字 throw 抛出,程序可以用throw语句引发明确的异常。如: try if(flag0) throw new NullPointerException(); throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象。,16,使用 throws,如果一个方法可能导致一个异常但不处理它,此时要求在方法声明中包含 throws 子句,通知潜在调用者,如果发生了异常,由调用者处理。 一个throws子句列举了一个方法可能引发的所有异常类型。,17,使用 throws示
9、例,class ThrowsDemo static void throwOne() throws IllegalAccessException System.out.println(“在throwOne中.“); throw new IllegalAccessException(“非法访问异常“); public static void main(String args) try throwOne(); catch(IllegalAccessException e) System.out.println(“捕获“+e); ,在该方法中没有处 理异常,只是声明 可能引发的异常,在throwOne
10、方法 的调用函数中捕 获并处理异常,18,用户自定义的异常,内置异常不可能始终足以捕获所有错误,因此需要用户自定义的异常类 用户自定义的异常类应为 Exception 类(或者Exception 类的子类)的子类 创建的任何用户自定义的异常类都可以获得 Throwable类定义的方法,class ArraySizeException extends NegativeArraySizeException ArraySizeException() super(“您传递的是非法的数组大小”); ,该类是Exception的子类,19,使用用户自定义的异常示例,class UserExceptionD
11、emo int size, array; UserExceptionDemo(int s) size = s; try checkSize(); catch(ArraySizeException e) System.out.println(e); void checkSize() throws ArraySizeException if(size 0) throw new ArraySizeException(); array = new intsize; for(int i = 0; i size; i+) arrayi = i+1; System.out.print(arrayi+“ “)
12、; public static void main(String arg) new UserExceptionDemo(Integer.parseInt(arg0); ,20,垃圾收集 4-1,垃圾收集是可将分配给对象但不再使用的内存回收或释放的过程 Java 将自动释放不再使用的内存 如果一个对象没有指向它的引用或将其赋值为 null,则此对象将适于进行垃圾收集,21,垃圾收集4-2,Java 虚拟机使用两个独立的堆内存,分别用于静态内存分配和动态内存分配。 其中一个是非垃圾收集堆内存,用于存储所有类定义、常量池和方法表。 另一个堆内存再分为两个可以根据要求往不同方向扩展的小块。 用于垃圾收
13、集的算法适用于存放在动态堆内存中的对象。,22,垃圾收集 4-3,垃圾收集器将在收集对象实例之前调用 finalize 方法。 即使显式调用垃圾收集 (System.gc( ) 方法,它也不能保证立即运行。 垃圾收集线程的运行优先级很低所以可能经常会被中断。,23,垃圾收集 4-4,垃圾收集器将作为优先级低的单独线程运行 可通过下列方式关闭应用程序中的垃圾收集 java noasyncgc 如果关闭了垃圾收集,程序极有可能会因为内存在某个时刻耗尽而失败 也可以通过下列方式调用垃圾回收线程 System.gc();,24,总结 2-1,运行时发生的错误称为异常。 必须捕获引发的每个异常,否则应用
14、程序不会正常中止。 异常处理允许在一个地方集中进行错误处理。这使得可以创建功能强大且健壮的代码。 Java 使用 try 和 catch 块来处理异常。try 块中的语句引发异常,而 catch 块则处理异常。,25,总结 2-2,可以同时使用多个 catch 块来分别处理各种异常类型。 程序可以用throw语句引发明确的异常。 关键字 throws 用于列出一个方法可能引发的异常类型。 不管是否发生了异常,都将执行 finally 块中的语句。 Java 中的垃圾收集就是将分配给对象但不再使用的内存回收或释放的过程。,26,自测题,运行时发生的错误称为_ A.异常 B.问题 C.消息 D.
15、none of about 2.java中异常处理的五个关键字是_, _,_,_,_. 3.需要监测错误的代码封入在_中。 try B. catch C. finally D. none of about 4.throw 的操作数一定是_类或其子类的对象。 A.java.lang.String B.java.lang.Throwable C.java.lang.Exceptiong D.none of about 5.关键字_用于引发异常,而关键字_则用于列举方法可能引发的异常。 A.throw,throws B.throws,throw C. throw,throwable 6._方法用于请求垃圾收集 A.System.gc() B.Runtime.gc() C.gc(),