当前位置:文档之家› 异常(Exception)处理

异常(Exception)处理


异常处理的优点
把错误处理代码从常规代码中分离出来
按错误类型和差别分组
对无法预测的错误进行捕获和处理
克服了传统方法的错误信息有限的问题
把错误传播给调用堆栈
系统预定义异常对象
Throwable Exception Error VirtualMachineError IOException ArithmeticException NullPointerException ClassNotFoundException
多重catch块
一段代码可能会引发多种类型的异常 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的 catch语句 执行其中的一条 catch 语句之后,其后的 catch 语句将被忽略
抛出异常
如果在当前环境无法解决一个异常,就要 将其抛出,把异常交给调用者处理
练习
编写类ExceptionTest2:
– –

定义两个方法:go()和main() 在go方法中声明要抛出异常,在该方法体内, 抛出一个Exception对象 在main()方法中,调用go方法,使用try/catch 捕获go方法中抛出的异常
用户自定义异常对象
系统预定义异常类代表了程序运行过程中可能产生的绝大多 数异常。如果希望记录和应用相关的错误信息,则可创建自 己的异常类。该类的定义和普通类无太大区别,只需继承 Exception类或RuntimeException类即可。例如:
Java异常的使用 异常的使用
对非运行时异常必须捕获或声明。对运行时异常, 对非运行时异常必须捕获或声明。对运行时异常,若不能预测它 何时发生,程序可不作处理,而是交给Java运行时系统来处理; 运行时系统来处理; 何时发生,程序可不作处理,而是交给 运行时系统来处理 若能预知它可能发生的地点和时间,则应在程序中处理, 若能预知它可能发生的地点和时间,则应在程序中处理,而不应 简单地交给运行时系统。 简单地交给运行时系统。 异常可以人为地抛出, 语句。 异常可以人为地抛出,用throw new 语句。 异常可以是系统已经定义好的,也可以是用户自己定义的。 异常可以是系统已经定义好的,也可以是用户自己定义的。用户 自己定义的异常一定继承自Throwable或Exception类。 自己定义的异常一定继承自 或 类 在自定义异常类时, 在自定义异常类时,如果它所对应的异常事件通常总是在运行时 产生,而且不容易预测它将在何时何地发生, 产生,而且不容易预测它将在何时何地发生,可以将它定义为运 行时异常,否则应定义为非运行时异常。 行时异常,否则应定义为非运行时异常。 应该使用finally语句为异常处理提供统一的出口。 语句为异常处理提供统一的出口。 应该使用 语句为异常处理提供统一的出口
public class MyProjException extends Exception { …… }
自定义异常
通过继承ng.Exception类声明自己的 异常类。 在方法适当的位置生成自定义异常的实例, 并用throw抛出。 在方法的声明部分用throws声明该方法可 能抛出的异常。
异常(Exception)处理 第七章 异常(Exception)处理
异常
运行期出现的错误 运行期 (注意看异常信息,看名字,看行号) 健壮性
代码
public class HelloWorld { public static void main (String args[]) { int i = 0; String greetings [] = { "Hello!","No","WORLD!"}; while (i < 4) { System.out.println (greetings[i]); i++; } } }
异常的执行流程
try{ 1 2 3 } catch(Exception e){ 4 } 5
正常顺序 1,2,3,5 异常顺序 1,2,4,5 try块外异常不理会
异常发生处
块后加入finally块,可以确保无论是否发生异常, 在try/catch块后加入 块后加入 块 可以确保无论是否发生异常, finally块中的代码总能被执行 块中的代码总能被执行
自定义异常举例: 自定义异常举例
public class ServerTimedOutException extends Exception{ private String serverName; private int port; public ServerTimedOutException(String serverName, int port){ this.serverName=serverName; this.port = port; } public int getPort(){ return port; } public void setPort(int port){ this.port = port; } public String getServerName(){ return serverName; } public void setServerName(String serverName){ this.serverName = serverNam的try、catch中被 处理,它将被抛至方法的调用者处。 如果异常被返回到main方法里,并且仍然 没有被处理,程序将异常中止。
练习
编写一个类ExceptionTest1,在main方法 中使用try、catch、finally:
– –

在try块中,编写被0除的代码 在catch块中,捕获被0除所产生的异常,并且 打印异常信息 在finally块中,打印一条语句
正常与异常
正常与异常之比可达30% 比 70%

打开文件
文件不存在? 文件打不开?

读取文件
没有足够可读内容? 权限不允许读

写文件
磁盘满 网络断线

关闭文件
异常机制简介
在进行程序设计时,错误的产生是不可避免的, 如何处理错误?把错误交给谁去处理?程序又该 如何从错误中恢复?这是任何程序设计语言都要 解决的问题。 所谓错误,是在程序运行过程中发生的异常事件, 比如除0溢出、数组越界、文件找不到等,这些事 件的发生将阻碍程序的正常运行。为了增加程序 的强壮性,程序设计时,必须考虑到可能发生的 异常情况并做出相应的处理。
public class Test{ public static void main(String[] args){ Test t=new Test(); try { t.connectMe("sinojava", 80); } catch (ServerTimedOutException e){ System.out.println("连接服务器 连接服务器"+e.getServerName()+",端口为 端口为"+e.getPort()+"失败 失败"); 连接服务器 端口为 失败 }} public void connectMe(String serverName,int port) throws ServerTimedOutException{ if(serverName.equals("sinojava")&&port==80){ System.out.println("连接成功 连接成功!"); 连接成功 }else throw new ServerTimedOutException("sinojava", port); } }
Exception
类 Exception 定义了一些你的程序可能出 现的轻度错误条件 异常可能发生在:
你试图打开的文件并不存在 网络连接中断 操作数处理的超出预描述的范围 需要加载的文件丢失
Error 类定义了一些严重的错误条件
Java的异常处理是通过 个关键字来实现的:try、catch、 的异常处理是通过5个关键字来实现的 的异常处理是通过 个关键字来实现的: 、 、 finally、throw、throws 、 、
捕获异常
抛出异常 thro w
声明异常 throw s
try
执行可能产生 异常的代码
catch
捕获异常
手动抛出异常
声明方法可能要 抛出的各种异常
finally
无论是否发生异常, 无论是否发生异常, 代码总能执行
try,catch 语句的使用
try { //这里的代码可能抛出一个特别的异常 } catch (MyExceptionType e) { 如果MyExceptionType 的异常被抛出,将执行 这里的代码 } catch (Exception e) { 如果一个一般 Exception 被抛出时,将执行这 里的代码 }
RuntimeException
FileNotFoundException
须查异常与不须查异常
须查异常 – 多数的 Throwable、Exception 不须查异常 – Error、RuntimeException 当在一个方法的代码中抛出一个须查异常时,这个异常或者 被方法中的try-catch结构捕获,或者在方法的throws语句中 声明 编译器检查程序保证所有须查异常都被程序显示的处理
关于异常的设计
异常处理不是用来代替测试程序 不要压制异常 抛出异常不是一件坏事
try 块 有异常 无异常 catch 块
finally 块
举例
public class HelloWorld2 { public static void main (String args[]) { int i = 0; String greetings [] = { "Hello world!", "No, I mean it!", "HELLO WORLD!!" }; while (i < 4) { try { System.out.println (greetings[i]); } catch (ArrayIndexOutOfBoundsException e){ System.out.println("Re-stting Index Value"); } finally { System.out.println("This is always printed"); } i++; } }}
相关主题