第七章 异常(Exception)处理

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

RuntimeException
FileNotFoundException
Exception
类 Exception 定义了一些你的程序可能出 现的轻度错误条件 异常可能发生在:
你试图打开的文件并不存在 网络连接中断 操作数处理的超出预描述的范围 需要加载的文件丢失
Error 类定义了一些严重的错误条件
手动抛出异常
声明方法可能要 抛出的各种异常
finally
无论是否发生异常, 无论是否发生异常, 代码总能执行
try,catch 语句的使用
try { //这里的代码可能抛出一个特别的异常 } catch (MyExceptionType e) { 如果MyExceptionType 的异常被抛出,将执 行这里的代码 } catch (Exception e) { 如果一个一般 Exception 被抛出时,将执行 这里的代码 }
异常处理的优点
把错误处理代码从常规代码中分离出来 按错误类型和差别分组 对无法预测的错误进行捕获和处理 克服了传统方法的错误信息有限的问题 把错误传播给调用堆栈
系统预定义异常对象
Throwable Exception Error VirtualMachineError IOException ArithmeticException NullPointerException ClassNotFoundException
关于异常的设计
异常处理不是用来代替测试程序 不要压制异常 抛出异常不是一件坏事
正常与异常
正常与异常之比可达30% 比 70%
– 打开文件
文件不存在? 文件打不开?
– 读取文件
没有足够可读内容? 权限不允许读
– 写文件
磁盘满 网络断线
– 关闭文件
异常机制简介
在进行程序设计时,错误的产生是不可避免的, 如何处理错误?把错误交给谁去处理?程序又该 如何从错误中恢复?这是任何程序设计语言都要 解决的问题。 所谓错误,是在程序运行过程中发生的异常事件, 比如除0溢出、数组越界、文件找不到等,这些 事件的发生将阻碍程序的正常运行。为了增加程 序的强壮性,程序设计时,必须考虑到可能发生 的异常情况并做出相应的处理。
编写类ExceptionTest2:
– 定义两个方法:go()和main() – 在go方法中声明要抛出异常,在该方法体内, 抛出一个Exception对象 – 在main()方法中,调用go方法,使用try/catch 捕获go方法中抛出的异常
用户自定义异常对象
系统预定义异常类代表了程序运行过程中可能产生的绝大 多数异常。如果希望记录和应用相关的错误信息,则可创 建自己的异常类。该类的定义和普通类无太大区别,只需 继承Exception类或RuntimeException类即可。例如:
Java的异常处理是通过 个关键字来实现的:try、catch、 的异常处理是通过5个关键字来实现的 的异常处理是通过 个关键字来实现的: 、 、 finally、throw、throws 、 、
捕获异常
抛出异常 thro w
声明异常 throw s
try
执行可能产生 异常的代码
catch
捕获异常
异常(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++; } } }
多重catch块
一段代码可能会引发多种类型的异常 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹 配的catch语句 执行其中的一条 catch 语句之后,其后的 catch 语句将被忽略
Biblioteka Baidu
抛出异常
如果在当前环境无法解决一个异常,就要 将其抛出,把异常交给调用者处理
练习
自定义异常举例: 自定义异常举例
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 = serverName; }}
异常的执行流程
正常顺序 1,2,3,5 异常顺序 1,2,4,5 try块外异常不理会
异常发生处
try{ 1 2 3 } catch(Exception e){ 4 } 5
块后加入finally块,可以确保无论是否发生异常, 在try/catch块后加入 块后加入 块 可以确保无论是否发生异常, finally块中的代码总能被执行 块中的代码总能被执行
Java异常的使用 异常的使用
对非运行时异常必须捕获或声明。对运行时异常, 对非运行时异常必须捕获或声明。对运行时异常,若不能预测它 何时发生,程序可不作处理,而是交给Java运行时系统来处理; 运行时系统来处理; 何时发生,程序可不作处理,而是交给 运行时系统来处理 若能预知它可能发生的地点和时间,则应在程序中处理, 若能预知它可能发生的地点和时间,则应在程序中处理,而不应 简单地交给运行时系统。 简单地交给运行时系统。 异常可以人为地抛出, 语句。 异常可以人为地抛出,用throw new 语句。 异常可以是系统已经定义好的,也可以是用户自己定义的。 异常可以是系统已经定义好的,也可以是用户自己定义的。用户 自己定义的异常一定继承自Throwable或Exception类。 自己定义的异常一定继承自 或 类 在自定义异常类时, 在自定义异常类时,如果它所对应的异常事件通常总是在运行时 产生,而且不容易预测它将在何时何地发生, 产生,而且不容易预测它将在何时何地发生,可以将它定义为运 行时异常,否则应定义为非运行时异常。 行时异常,否则应定义为非运行时异常。 应该使用finally语句为异常处理提供统一的出口。 语句为异常处理提供统一的出口。 应该使用 语句为异常处理提供统一的出口
public class MyProjException extends Exception { …… }
自定义异常
通过继承java.lang.Exception类声明自己 的异常类。 在方法适当的位置生成自定义异常的实例, 并用throw抛出。 在方法的声明部分用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++; } }}
异常处理机制
如果一个异常没有在当前的try、catch中 被处理,它将被抛至方法的调用者处。 如果异常被返回到main方法里,并且仍然 没有被处理,程序将异常中止。
练习
编写一个类ExceptionTest1,在main方法 中使用try、catch、finally:
– 在try块中,编写被0除的代码 – 在catch块中,捕获被0除所产生的异常,并且 处理异常 – 在finally块中,打印一条语句
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); } }
相关文档
最新文档