Java异常处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

异常的概念
class ExcepTest { public void main(String args[]) .{ int b=0; int a; try { a=5/b;} catch(ArithmeticException e) { System.out.println(“divided by 0”);} }}
异常的概念
观察前面的程序你会发现大部分精力花在 出错处理上了. 只把能够想到的错误考虑到,对以外的情况 无法处理 程序可读性差 出错返回信息量太少
异常的概念
用异常的形式处理错误 read-File; { try { openTheFile; determine its size; allocate that much memory; closeTheFile; ; }catch(fileopenFailed) { dosomething; } catch(sizeDetermineFailed) {dosomething;} catch(memoryAllocateFailed){ dosomething;} catch(readFailed){ dosomething;} catch(fileCloseFailed) { dosomething; } catch(Exception) {dosomething;} //其它未考虑到的 错误 }
异常
异常的概念 异常的分类 捕获异常 声明异常 抛出异常 创造自己的异常 总结
异常的概念
什么是异常? 异常实际上是程序中错误导致中断了正常 的指令流的一种事件. 没有处理错误的程序: read-file { openTheFile; determine its size; allocate that much memory; closeTheFile; }
捕获例外
—— catch语句 catch语句
例外总是由距离产生例外最近的匹配catch代码段处理 如果没有相应的例外处理,
则例外被交给上一层try代码段进行处理
例外处理的查找依据类型匹配原则顺序进行
第一个匹配的例外处理被执行,当例外处理执行完毕,程序 接着最后一个catch代码段后的语句执行
例外处理的顺序影响到例外的处理
public static void main(String[] args) { try { testThrowable(); } catch (Throwable t) { System.err.println(t.toString()); System.err.println(t.getMessage()); System.err.println(t.getLocalizedMessage()); t.printStackTrace(System.err); } } … static void testThrowable() throws Throwable { throw new Throwable(); } java.lang.Throwable null null java.lang.Throwable at test.Untitled1.testThrowable(Untitled1.java:137) at test.Untitled1.main(Untitled1.java:79)
异常的概念
和传统的方法比较异常的优点: 1.把错误代码从常规代码中分离出来 2. 把错误传播给调 method4 探测抛出例外 调 用堆栈 method3 传 3. 错误 和 用 method2 method1 例外 错误 分 4. 统 法 测的错误的 和 5. 传统方法的错误 的
异常的概念
什么情况下使用例外机制? 什么情况下使用例外机制?
public static void main(String[] args) { try { testThrowable(); } catch (Throwable t) { System.err.println(t.toString()); System.err.println(t.getMessage()); System.err.println(t.getLocalizedMessage()); t.printStackTrace(); } } … static void testThrowable() throws Throwable { throw new Throwable("测试 Throwable 的用法。"); 的用法。 测试 } java.lang.Throwable: 测试 Throwable 的用法。 的用法。 的用法。 测试 Throwable 的用法。 的用法。 测试 Throwable 的用法。 java.lang.Throwable: 测试 Throwable 的用法。 的用法。 at test.Untitled1.testThrowable(Untitled1.java:137) at test.Untitled1.main(Untitled1.java:79)
例外的分类
例外示例: 例外示例: (1)编译时例外:在程序中必须对其进行处理, )编译时例外:在程序中必须对其进行处理, 否则编译器会指出错误。 否则编译器会指出错误。
在使用能够产生异常的方法而没有捕获和处理,程序 将不能通过编译。 。
(2)运行时例外:程序中可以不做处理,直接由 )运行时例外:程序中可以不做处理, 运行时系统来处理。 运行时系统来处理。
捕获例外
catch语句
每个try语句必须伴随一个或多个catch语句,用于捕获try 代码块所产生的例外并做相应的处理。 catch语句有一个形 式参数,用于指明其所能捕获得例外类型,运行时系统通过 参数值把被抛弃的例外对象传递给catch语句。 程序设计中要根据具体的情况来选择catch语句的例外处 理类型,一般应该按照try代码块中例外可能产生的顺序及其 真正类型进行捕获和处理,尽量避免选择最一般的类型作为 catch语句中指定要捕获的类型。 当然也可以用一个catch语句处理多个例外类型,这时它 的例外类型应该是这多个例外类型的父类 父类,但这种方式使得 父类 在程序中不能确切判断例外的具体类型。
—— catch语句 catch语句
尽量避免用一般类型作为catch中指定要捕获的类型。
一般应该按照try代码块中例外可能产生的顺序及其真正类型 进行捕获和处理,
在例外处理中无法访问try代码段中声明的变量
因为此时try代码段已经退出了,例外处理所需要的任何信息 一般都应该通过例外对象来传递
在使用方法时尽量直接处理该方法可能产生的例外
这样你的程序就会更健壮
在使用库方法之前,应该先仔细阅读说明文档
那里会介绍方法可能产生的例外以及例外产生的条件
在使用各种例外类之前也应该先仔细阅读说明文档
那里会介绍例外的具体含义及例外产生的条件
捕获例外
—— catch语句 catch语句
在catch代码段中产生的例外不是由相同try的后续 catch代码段处理,而是由包含整个try-catch结构的上 层try代码段检测并处理 可以把catch到的例外对象再次抛出,使上层try-catch 结构继续处理该例外事件;也可以把例外对象转换为 其它例外对象…
当方法因为自身无法控制的原因而不能完成其任务
文件不存在,网络连接无法建立……
处理在方法、类库、类中抛出的例外
如FileInputStream.read产生IOException
在大的项目中采用统一的பைடு நூலகம்式处理例外时
如编写一个文字处理器
例外应该是不经常发生但却可能发生的故障
一定发生的事件不应该用例外机制来处理
捕获异常
捕获并处理异常 try { //接受监视的程序块,在此区域内发生 //的异常,由catch中指定的程序处理; } // 不能有其它语句分隔 catch(要处理的异常种类和标识符) { //处理异常; }catch(要处理的异常种类和标识符) { //处理异常; }
捕获例外
try语句 捕获例外的第一步就是用try {…}语句指定了一 段代码,该段代码就是一次捕获并处理例外的范围。 在执行过程中,该段代码可能会产生并抛弃一个或 多个例外,因此,它后面的catch语句进行捕获时也 要做相应的处理。 如果没有例外产生,所有的catch代码段都被略过 不执行。
例外处理用于使系统从故障中恢复
提示信息/不产生无效的结果/释放资源
异常的概念
不同的例外处理策略
关键性应用(处理所有例外) 实验软件(可以忽略许多例外)
处理例外时的注意事项
终止程序会导致资源泄漏,利用例外处理释 放资源 尽可能近地处理例外,这样程序清晰易读 能在局部处理的错误不要使用例外机制
例外机制的处理比正常处理效率低
例外的分类
Error:由Java虚拟机生成并抛出,包括动态链接失败、 虚拟机错误等,Java程序不做处理。 Runtime Exception:Java虚拟机在运行时生成的例 外,如被0除等系统错误、数组下标超范围等,其产生比 较频繁,处理麻烦,对程序可读性和运行效率影响太大。 因此由系统检测, 用户可不做处理,系统将它们交给缺省 的异常处理程序(当然,必要时,用户可对其处理)。 Exception:一般程序中可预知的问题,其产生的例外 可能会带来意想不到的结果,因此Java编译器要求Java 程序必须捕获或声明所有的非运行时异常。
try{ URL url=new URL(http://www.hit.edu.cn/”,”hit.gif”);} catch(MalformedURLException e) { badURL=true; repaint();}
异常的分类
异常是一个对象,它继承自Throwable类,所有的 Throwable类的子孙类所产生的对象都是例外. Error:由Java虚拟机生成并抛出,Java程序不做处 理. Runtime Exception(被0除等系统错误,数组下标 超范围):由系统检测, 用户的Java 程序可不做处 理,系统将它们交给缺省的异常处理程序. Exception(程序中的问题,可预知的): Java编译器 要求Java程序必须捕获或声明所有的非运行时异 常 throw:用户自己产生异常
异常的分类
异常的分类
Throwable
用户自己产生的异常 .
要处理 Error 不做处理 由用户捕获或 声明并处理
Exception RuntimeException
缺省的异常 处理程序
例外的分类
一个例外是由一个对象来代表的,所有的例外都 直接或间接地继承自Throwable类。 在Java类库的每个类包中都定义了例外类,这些 例外类分成两大类:Error类及Exception类,后者是 Java程序中需要大量处理的。 除了Java类库所定义的例外类之外,用户也可以 通过继承已有的例外类来定义自己的例外类,并在 程序中使用(利用throw产生,throws声明抛出, catch捕捉并处理)。
子类例外可被父类例外处理捕获 不要先捕获父类例外,再捕获子类例外
catch(Exception e)
捕获所有Exception
catch(Throwable t)
捕获Exception和Error
如果找不到相应的例外处理
非GUI程序将结束程序执行; Applet或GUI程序则回复到事件处理状态
捕获例外
异常的概念
以常规方法处理错误 openFiles; if (theFilesOpen) { determine the lenth of the file; if (gotTheFileLength){ allocate that much memory; if (gotEnoughMemory) { read the file into memory; if (readFailed) errorCode=-1; else errorCode=1; }else errorCode=-3; }else errorCode=-5 ; }else errorCode=-5;
相关文档
最新文档