Java异常处理
异常
异常的概念 异常的分类 捕获异常 声明异常 抛出异常 创造自己的异常 总结
异常的概念
什么是异常? 异常实际上是程序中错误导致中断了正常 的指令流的一种事件. 没有处理错误的程序: read-file { openTheFile; determine its size; allocate that much memory; closeTheFile; }
例外处理用于使系统从故障中恢复
提示信息/不产生无效的结果/释放资源
异常的概念
不同的例外处理策略
关键性应用(处理所有例外) 实验软件(可以忽略许多例外)
处理例外时的注意事项
终止程序会导致资源泄漏,利用例外处理释 放资源 尽可能近地处理例外,这样程序清晰易读 能在局部处理的错误不要使用例外机制
例外机制的处理比正常处理效率低
—— catch语句 catch语句
尽量避免用一般类型作为catch中指定要捕获的类型。
一般应该按照try代码块中例外可能产生的顺序及其真正类型 进行捕获和处理,
在例外处理中无法访问try代码段中声明的变量
因为此时try代码段已经退出了,例外处理所需要的任何信息 一般都应该通过例外对象来传递
在使用方法时尽量直接处理该方法可能产生的例外
捕获例外
—— catch语句 catch语句
例外总是由距离产生例外最近的匹配catch代码段处理 如果没有相应的例外处理,
则例外被交给上一层try代码段进行处理
例外处理的查找依据类型匹配原则顺序进行
第一个匹配的例外处理被执行,当例外处理执行完毕,程序 接着最后一个catch代码段后的语句执行
例外处理的顺序影响到例外的处理
例外的分类
Error:由Java虚拟机生成并抛出,包括动态链接失败、 虚拟机错误等,Java程序不做处理。 Runtime Exception:Java虚拟机在运行时生成的例 外,如被0除等系统错误、数组下标超范围等,其产生比 较频繁,处理麻烦,对程序可读性和运行效率影响太大。 因此由系统检测, 用户可不做处理,系统将它们交给缺省 的异常处理程序(当然,必要时,用户可对其处理)。 Exception:一般程序中可预知的问题,其产生的例外 可能会带来意想不到的结果,因此Java编译器要求Java 程序必须捕获或声明所有的非运行时异常。
ቤተ መጻሕፍቲ ባይዱ
例外的分类
例外示例: 例外示例: (1)编译时例外:在程序中必须对其进行处理, )编译时例外:在程序中必须对其进行处理, 否则编译器会指出错误。 否则编译器会指出错误。
在使用能够产生异常的方法而没有捕获和处理,程序 将不能通过编译。 。
(2)运行时例外:程序中可以不做处理,直接由 )运行时例外:程序中可以不做处理, 运行时系统来处理。 运行时系统来处理。
子类例外可被父类例外处理捕获 不要先捕获父类例外,再捕获子类例外
catch(Exception e)
捕获所有Exception
catch(Throwable t)
捕获Exception和Error
如果找不到相应的例外处理
非GUI程序将结束程序执行; Applet或GUI程序则回复到事件处理状态
捕获例外
捕获例外
catch语句
每个try语句必须伴随一个或多个catch语句,用于捕获try 代码块所产生的例外并做相应的处理。 catch语句有一个形 式参数,用于指明其所能捕获得例外类型,运行时系统通过 参数值把被抛弃的例外对象传递给catch语句。 程序设计中要根据具体的情况来选择catch语句的例外处 理类型,一般应该按照try代码块中例外可能产生的顺序及其 真正类型进行捕获和处理,尽量避免选择最一般的类型作为 catch语句中指定要捕获的类型。 当然也可以用一个catch语句处理多个例外类型,这时它 的例外类型应该是这多个例外类型的父类 父类,但这种方式使得 父类 在程序中不能确切判断例外的具体类型。
异常的概念
以常规方法处理错误 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;
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 的用法。"); 的用法。 测试 } ng.Throwable: 测试 Throwable 的用法。 的用法。 的用法。 测试 Throwable 的用法。 的用法。 测试 Throwable 的用法。 ng.Throwable: 测试 Throwable 的用法。 的用法。 at test.Untitled1.testThrowable(Untitled1.java:137) at test.Untitled1.main(Untitled1.java:79)
异常的概念
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”);} }}
try{ URL url=new URL(/”,”hit.gif”);} catch(MalformedURLException e) { badURL=true; repaint();}
异常的分类
异常是一个对象,它继承自Throwable类,所有的 Throwable类的子孙类所产生的对象都是例外. Error:由Java虚拟机生成并抛出,Java程序不做处 理. Runtime Exception(被0除等系统错误,数组下标 超范围):由系统检测, 用户的Java 程序可不做处 理,系统将它们交给缺省的异常处理程序. Exception(程序中的问题,可预知的): Java编译器 要求Java程序必须捕获或声明所有的非运行时异 常 throw:用户自己产生异常
捕获异常
捕获并处理异常 try { //接受监视的程序块,在此区域内发生 //的异常,由catch中指定的程序处理; } // 不能有其它语句分隔 catch(要处理的异常种类和标识符) { //处理异常; }catch(要处理的异常种类和标识符) { //处理异常; }
捕获例外
try语句 捕获例外的第一步就是用try {…}语句指定了一 段代码,该段代码就是一次捕获并处理例外的范围。 在执行过程中,该段代码可能会产生并抛弃一个或 多个例外,因此,它后面的catch语句进行捕获时也 要做相应的处理。 如果没有例外产生,所有的catch代码段都被略过 不执行。
异常的概念
观察前面的程序你会发现大部分精力花在 出错处理上了. 只把能够想到的错误考虑到,对以外的情况 无法处理 程序可读性差 出错返回信息量太少
异常的概念
用异常的形式处理错误 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;} //其它未考虑到的 错误 }
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(); } ng.Throwable null null ng.Throwable at test.Untitled1.testThrowable(Untitled1.java:137) at test.Untitled1.main(Untitled1.java:79)
异常的分类
异常的分类
Throwable
用户自己产生的异常 .
要处理 Error 不做处理 由用户捕获或 声明并处理