您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第5章 (3)异常与垃圾收集
Version3.0(三)异常和垃圾收集第五章2回顾•类中的静态成员属于类。•final修饰符可应用于类、方法和变量。•定义抽象类的目的是提供可由其子类共享的一般形式。•接口就是需要由其他类实现的行为模板。•访问控制级别:public、protected、缺省、private•封装类就是封装基本数据类型的类。•内部类指嵌入外部类内的类。3目标•了解异常的定义•了解异常的分类•掌握try、catch和finally语句的用法•掌握throw、throws子句的用法•掌握如何定义自己的异常•了解Java的垃圾收集机制4什么是异常•运行时发生的错误称为异常。处理这些异常就称为异常处理。•可能的错误,比如:用户输入错误(URL不存在),设备错误(打印机关闭),物理限制(内存,磁盘空间不够),代码错误(数组下标越界)等5异常的处理•返回到一个安全的状态并允许用户执行其他命令。•允许用户保存其工作状态并妥善终止该程序。6Java异常处理基础•Java异常处理机制采用一个统一和相对简单的抛出和处理错误的机制。如果一个方法本身能引发异常,当所调用的方法出现异常时,调用者可以捕获异常使之得到处理;也可以回避异常,这时异常将在调用的堆栈中向下传递,直到被处理。7发生错误的方法没有异常处理的方法有异常处理的方法Main(…)发生错误的方法没有异常处理的方法有异常处理的方法Main(…)调用栈异常处理过程8异常体系结构所有异常类型都是内置类Throwable的子类用于Java运行时系统来显示与运行时系统本身有关的错误用于用户程序可能捕获的异常,也是用来创建用户异常类型子类的类。Error类对象由Java虚拟机生成并抛出;Exception类对象由应用程序处理或抛出。9常见异常(RuntimeException及其子类)异常说明RuntimeExceptionjava.lang包中多数异常的基类ArithmeticException算术错误,如除以0IllegalArgumentException方法收到非法参数ArrayIndexOutOfBoundsException数组下标出界NullPointerException试图访问null对象引用SecurityException试图违反安全性RuntimeException也可以不处理10常见的异常(非RuntimeException)异常说明ClassNotFoundException不能加载请求的类AWTExceptionAWT中的异常IOExceptionI/O异常的根类FileNotFoundException不能找到文件EOFException文件结束IllegalAccessException对类的访问被拒绝NoSuchMethodException请求的方法不存在InterruptedException线程中断这类异常必须捕获或声明抛出11异常处理模型•由五个关键字try、catch、throw、throws和finally处理。•Java中可用于处理异常的两种方式:–自行处理:可能引发异常的语句封入在try块内,而处理异常的相应语句则封入在catch块内。–回避异常:在方法声明中包含throws子句,通知潜在调用者,如果发生了异常,必须由调用者处理。12try-catch块示例publicclassExceptionDemo{publicstaticvoidmain(Stringargs[]){try{intc=calculate(9,0);System.out.println(c);}catch(Exceptione){System.err.println(发生异常:+e.toString());e.printStackTrace();}}staticintcalculate(inta,intb){intc=a/b;returnc;}}调用函数calculate,将引发一个异常在catch块中处理异常输出结果13多个catch块•单个代码片段可能会引起多个错误。•可提供多个catch块分别处理各种异常类型。...try{}catch(ArrayIndexOutOfBoundsExceptione){}catch(Exceptione){}...ArrayIndexOutOfBoundsException类为Exception类的子类,子类的catch块应该在父类之前,否则不会进入子类的catch块,没有意义,编译也不能通过。14多个catch块示例classCatch22{publicstaticvoidmain(Stringargs[]){try{Stringnum=args[0];intnumValue=Integer.parseInt(num);System.out.println(平方为+numValue*numValue);}catch(ArrayIndexOutOfBoundsExceptionne){System.out.println(未提供任何参数!);}catch(NumberFormatExceptionnb){System.out.println(不是数字!);}}}输出结果15嵌套的try-catch块•有时,块的一部分引起一个错误,而整个块可能又引起另一个错误。在此情况下,需要将一个异常处理程序嵌套到另一个中。•在使用嵌套的try块时,将先执行内部try块,如果没有遇到匹配的catch块,则将检查外部try块的catch块。16finally块•确保了在出现异常时所有清除工作都将得到处理•与try块一起使用•无论是否出现异常,finally块都将运行finallycatch块finally异常没有异常try块17finally块示例classAAA{staticintFinallyDemo(Stringargs[]){try{intno1=Integer.parseInt(args[0]);intno2=Integer.parseInt(args[1]);System.out.println(相除结果为+no1/no2);return0;}catch(ArithmeticExceptioni){System.out.println(不能除以0);return1;}finally{System.out.println(Finally已执行);return2;}}publicstaticvoidmain(String[]args){System.out.println(FinallyDemo(args));}18•如果在try或catch块中遇到return,先转向finally块,执行finally块中的语句,如果在finally块中也遇到return则执行finally块中的return,否则执行完finally块后执行转入finally块之前在try或catch块中遇到的return.•如果此3处均未遇到return在finally块之后程序仍继续执行。19使用throw抛出异常•异常是通过关键字throw抛出,程序可以用throw语句引发明确的异常。如:try{if(obj==null){thrownewNullPointerException();}}•throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象。20使用throws声明可能引发的受检异常•受检异常(checkedexception)是指除Error或RuntimeException及它们子类以外类型的所有异常。•如果一个方法可能导致一个受检异常但不处理它,此时要求在方法声明中包含throws子句,通知潜在调用者。•一个throws子句列举了一个方法可能引发的所有受检异常类型。21使用throws示例classThrowsDemo{staticvoidthrowOne()throwsIllegalAccessException{System.out.println(在throwOne中.);thrownewIllegalAccessException(非法访问异常);}publicstaticvoidmain(Stringargs[]){try{throwOne();}catch(IllegalAccessExceptione){System.out.println(捕获+e);}}}在该方法中没有处理异常,只是声明可能引发的异常在throwOne方法的调用函数中捕获并处理异常22用户自定义的异常•内置异常不可能始终足以捕获所有错误,因此需要用户自定义的异常类•用户自定义的异常类应为Exception类(或者Exception类的子类)的子类•创建的任何用户自定义的异常类都可以获得Throwable类定义的方法classArraySizeExceptionextendsException{ArraySizeException(){super(“您传递的是非法的数组大小”);}}23使用用户自定义的异常示例classUserExceptionDemo{intsize,array[];UserExceptionDemo(ints){size=s;try{checkSize();}catch(ArraySizeExceptione){System.out.println(e);}}voidcheckSize()throwsArraySizeException{if(size0)thrownewArraySizeException();array=newint[size];for(inti=0;isize;i++){array[i]=i+1;System.out.print(array[i]+);}}publicstaticvoidmain(Stringarg[]){newUserExceptionDemo(Integer.parseInt(arg[0]));}}输出结果24垃圾收集2-1•垃圾收集是可将分配给对象但不再使用的内存回收或释放的过程•Java将自动释放不再使用的内存•如果一个对象没有指向它的引用或将其赋值为null,则此对象将适于进行垃圾收集25垃圾收集2-2•垃圾收集器将作为优先级低的单独线程运行•可通过下列方式关闭应用程序中的垃圾收集java–noasyncgc…•如果关闭了垃圾收集,程序极有可能会因为内存在某个时刻耗尽而失败26使用finalize方法•Object类具有finalize()方法,本身不做任何事。子类可以覆盖它。•如果存在finalize(),它将在垃圾收集前被执行一次,而且每个对象仅执行一次protectedvoidfinalize()throwsThrowable•可以建议垃圾收集,但并不能保证它何时会发生27总结2-1•运行时发生的错误称为异常。•必须捕获引发的每个异常,否则应用程序不会正常中止。•异常处理允许在一个地方集中进行错误处理。这使得可以创建功能强大且健壮的代码。•Java使用try和catch块来处理异常。try块中的语句引发异常,而catch块则处理异常。28总结2-2•可以同时使用多个catch块来分别处理各种异常类型。•程序可以用throw语句引发明确的异常。•关键字throws用于列出一个方法可能引发的异常类型。•不管是否发生了异常,都将执行finally块中的语句。•Java中的垃圾收集就是将分配给对象但不再使用的内存回收或释放的过程。
本文标题:第5章 (3)异常与垃圾收集
链接地址:https://www.777doc.com/doc-4005744 .html