




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 异常和垃圾收集 第五讲 2 回顾 类中的静态成员属于类 final修饰符可应用于类 方法和变量 定义抽象类的目的是提供可由其子类共享的一般形式 接口就是需要由其他类实现的行为模板 访问控制级别 public protected 缺省 private封装类就是封装基本数据类型的类 内部类指嵌入外部类内的类 3 目标 了解异常的定义了解异常的分类掌握try catch和finally语句的用法掌握throw throws子句的用法掌握如何定义自己的异常了解Java的垃圾收集机制 4 什么是异常 运行时发生的错误称为异常 处理这些异常就称为异常处理 一旦引发异常 程序将突然中止 且控制将返回操作系统 发生异常后此前分配的所有资源都将保留在相同的状态 这将导致资源漏洞 5 Java异常处理基础 Java异常处理机制采用一个统一和相对简单的抛出和处理错误的机制 如果一个方法本身能引发异常 当所调用的方法出现异常时 调用者可以捕获异常使之得到处理 也可以回避异常 这时异常将在调用的堆栈中向下传递 直到被处理 6 异常体系结构 所有异常类型都是内置类Throwable的子类 用于Java运行时系统来显示与运行时系统本身有关的错误 用于用户程序可能捕获的异常 也是用来创建用户异常类型子类的类 Error类对象由Java虚拟机生成并抛出 Exception类对象由应用程序处理或抛出 7 常见异常及其用途2 1 8 常见的异常及其用途2 2 9 异常处理模型 由五个关键字try catch throw throws和finally处理 Java中可用于处理异常的两种方式 自行处理 可能引发异常的语句封入在try块内 而处理异常的相应语句则封入在catch块内 回避异常 在方法声明中包含throws子句 通知潜在调用者 如果发生了异常 必须由调用者处理 10 try 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块中处理异常 输出结果 11 多个catch块 单个代码片段可能会引起多个错误 可提供多个catch块分别处理各种异常类型 try catch ArrayIndexOutOfBoundsExceptione catch Exceptione ArrayIndexOutOfBoundsException类为Exception类的子类 但是如果异常属于ArrayIndexOutOfBoundsException类将执行第一个catch块 之后控制将转向try catch块之后的语句 所以始终不会执行第二个catch块 12 多个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 不是数字 13 嵌套的try catch块 有时 块的一部分引起一个错误 而整个块可能又引起另一个错误 在此情况下 需要将一个异常处理程序嵌套到另一个中 在使用嵌套的try块时 将先执行内部try块 如果没有遇到匹配的catch块 则将检查外部try块的catch块 14 finally块 确保了在出现异常时所有清除工作都将得到处理与try块一起使用无论是否出现异常 finally块都将运行 15 finally块示例 classFinallyDemo intno1 no2 FinallyDemo Stringargs try no1 Integer parseInt args 0 no2 Integer parseInt args 1 System out println 相除结果为 no1 no2 catch ArithmeticExceptioni System out println 不能除以0 finally System out println Finally已执行 publicstaticvoidmain Stringargs newFinallyDemo args 16 使用throw 异常是通过关键字throw抛出 程序可以用throw语句引发明确的异常 如 try if flag 0 thrownewNullPointerException throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象 17 使用throws 如果一个方法可能导致一个异常但不处理它 此时要求在方法声明中包含throws子句 通知潜在调用者 如果发生了异常 由调用者处理 一个throws子句列举了一个方法可能引发的所有异常类型 这对于除Error或RuntimeException及它们子类以外类型的所有异常是必要的 18 使用throws示例 classThrowsDemo staticvoidthrowOne throwsIllegalAccessException System out println 在throwOne中 thrownewIllegalAccessException 非法访问异常 publicstaticvoidmain Stringargs try throwOne catch IllegalAccessExceptione System out println 捕获 e 在该方法中没有处理异常 只是声明可能引发的异常 在throwOne方法的调用函数中捕获并处理异常 19 用户自定义的异常 内置异常不可能始终足以捕获所有错误 因此需要用户自定义的异常类用户自定义的异常类应为Exception类 或者Exception类的子类 的子类创建的任何用户自定义的异常类都可以获得Throwable类定义的方法 classArraySizeExceptionextendsNegativeArraySizeException ArraySizeException super 您传递的是非法的数组大小 该类是Exception的子类 20 使用用户自定义的异常示例 classUserExceptionDemo intsize array UserExceptionDemo ints size s try checkSize catch ArraySizeExceptione System out println e voidcheckSize throwsArraySizeException if size 0 thrownewArraySizeException array newint size for inti 0 i size i array i i 1 System out print array i publicstaticvoidmain Stringarg newUserExceptionDemo Integer parseInt arg 0 21 垃圾收集 垃圾收集 GarbageCollection JVM周期性地清除那些已确定不会再被使用的对象 回收其内存空间的过程垃圾收集是由JVM的 垃圾回收器 GarbageCollector 自动执行的 程序员不可控制它何时运行对象被执行垃圾收集的时机 没有任何 对象变量 去引用此对象的时候 具体有两种情况 对象变量的生命周期已经结束手动地将对象变量的值赋为null 或改成去引用其它的对象 22 垃圾收集的时机示例 classTestgc publicstaticvoidmain String args Booleanb1 newBoolean true if b1 booleanValue true Strings1 newString thisisaStringobject System out println test1 s1 s1 s1对象变量生命周期结束 自动解除对对象的引用 之后s1原来所指向的对象会被自动垃圾收集 System out println test2 s1 s1 错误 已超出s1的有效范围System out println test3 b1 booleanValue b1 booleanValue b1 null 手动解除b1对象变量的引用 之后b1原来所指向的对象会被自动垃圾收集System out println test4 b1 booleanValue b1 booleanValue 错 b1没有引用对象 23 垃圾收集的处理2 1 在对象被垃圾收集之前 垃圾回收器会给它们机会来清除自己 清除的方式就是使用该对象的finalize 方法 这个方法实际上是在Object类中定义的 这个清除自己的动作 被称之为finalization 为什么要有finalize 方法 垃圾回收器并不能为我们处理所有释放资源的工作 有些资源是它所无法控制的 例如使用到JNI JavaNativeInterface 的部分 如 调用c语言的函数来分配内存 就需要程序员自己来规划内存的释放工作 如何使用finalize 方法 你不能直接使用finalize 方法 需要在你自己的类中 覆写这个方法 在对该类对象进行垃圾回收前 垃圾回收器会执行一次这个方法 24 垃圾收集的处理2 2 使用Runtime类的gc 方法或System类的gc 方法可以建议JVM为我们作垃圾回收的工作 但并不能保证它何时会发生记住以下几点 垃圾回收只与内存有关只要内存还够用 垃圾回收器可能不启动 对象不一定会被垃圾回收器回收总之要记住 垃圾回收和finalize 都是靠不住的 只要JVM还没到快要耗尽内存的地步 它是不会浪费时间来回收垃圾以恢复内存的 25 使用gc 方法 classGctest publicstaticvoidmain String args Runtimert Runtime getRuntime 创建一个Runtime类的对象Character ch1 newCharacter 260 for intx 0 x 26 26 总结2 1 运行时发生的错误称为异常 必须捕获引发的每个异常 否则应用程序不会正常中止 异
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全教育课件
- 女巫帽儿童课件
- 2025合同范本房地产租赁合同协议样本
- 2025正式的个人借款合同协议
- 2025企业办公室物业委托管理合同标准版样式
- 货运练习试题附答案
- 颈部神经源性肿瘤诊治进展
- 2025-2030素食辣味粉市场投资前景分析及供需格局研究研究报告
- 2025-2030中国桥梁钢结构行业深度调研及投资前景预测研究报告
- 2025-2030中国八宝粥行业深度调研及投资前景预测研究报告
- 2025年继续教育公需课必修课考试题库附含参考答案
- 渐进多焦点镜片设计特点
- 公共知识法律试题及答案
- 2025中国广电山东网络有限公司市县公司招聘145人笔试参考题库附带答案详解
- 天津市公安局为留置看护总队招聘警务辅助人员笔试真题2024
- 2025-2030中国光稳定剂行业市场现状供需分析及投资评估规划分析研究报告
- 合肥市2025届高三年级5月教学质量检测(合肥三模)物理试题+答案
- 【MOOC】大学物理-力学、电磁学-重庆大学 中国大学慕课MOOC答案
- 矿坑涌水量的预测方法 -(解析法)
- 有限空间作业审批
- 医院超融合服务器项目供货合同
评论
0/150
提交评论