Presentation is loading. Please wait.

Presentation is loading. Please wait.

异常及处理.

Similar presentations


Presentation on theme: "异常及处理."— Presentation transcript:

1 异常及处理

2 ● 编程中的错误 1、编译错误 程序出现语法问题和拼写问题,不能通过由源代码到字节码的编译。由JAVA语言的编译系统负责检测和报告。 如,程序某语句缺少该有的分号(;),标识符大小写错误,关键字(保留字)写错等。 当编译时,系统自动给出提示。如 C:\jdk\bin>javac TryTest.java TryTest.java:7: 期望 ';' String s="abc" ^ 1 个错误 (应按错误灵活检查)

3 2、运行错误 (分为系统错误、逻辑错误) 系统错误:运行时引发操作系统问题。如死循环、死机等。比较隐晦。 逻辑错误:不能实现设计意图。例如运算符写错,计算结果相应不正确。 运行错误的排除:利用JDB调试程序 C:\jdk\bin>javac -g TryTest.java C:\jdk\bin>jdb TryTest Initializing jdb... > stop at TryTest:6 Deferring breakpoint TryTest:6. It will be set after the class is loaded. >run …… step 或用jdb直接进入,并可用?/help得到帮助 使用exit/quit 退出

4 ● 异常与异常类 我们编制的程序首先假定用户在使用时,不会对0整数去做除法,不会去找不存在的文件,不会去打开不存在的网点……,但实际上这些漏洞(bug)经常存在。 ∴ 在编程时,在发生这样的错误时至少应完成以下工作: 报告错误和导致错误原因 对错误进行处理 必要时正常终止程序并尽量保存数据 JAVA 语言利用异常处理机制(Exception)处理程序可能发生的错误。

5 ▲异常(Exception)(/例外) 异常是异常事件(Exception event)的简称,通常指的是在程序运行中导致正常程序流程中断的事件。 异常类----代表一种运行错误,类中包含了该运行错误的信息和处理错误的方法等。 异常处理机制:当发生可识别错误,系统产生相应异常类的对象,系统启用相应机制去处理它,以保证运行安全。 JAVA 异常处理机制的核心任务----将系统的控制权从发生错误的指令处转移到对错误进行处理的地方。

6 ▲异常类 在JAVA语言中,被处理的是异常类的一个对象,是系统类Throwable或其子类的实例。 异常类结构图:参照p Throwable Error Exception ………… R ArithmeticException 算术错误 NumberFormatException IOException 输入输出错误 ClassNotFountException

7

8 Error 错误类定义严重的错误 ,在大多数情况下,当遇到这样的错误时,建议让程序中断。比如说内存溢出。不可能指望程序能处理这样的情况。
Exception 异常类定义程序所遇到的轻微错误,可以写代码来处理异常并继续程序执行,而不是让程序中断。 如: ArithmeticException—整数被0除,运算得出的结果。 int i =12 / 0; NullPointerException—当对象没被实例化时,访问对象的属性或方法的尝试: Date d= null; System.out.println(d.toString()); ArrayIndexOutOfBoundsException—访问超过数组大小范围的一个元素的尝试。

9 ▲抛出异常 方法需要抛出异常的四种情况: ⑴ 在方法中调用了本身会抛出异常的方法。 (间接抛出) ⑵ 在方法设计中,对不能处理的情况人为的生成了一个异常对象,并用throw语句抛出。 ⑶ 程序出现非法操作,如整数除法0为除数。 ⑷ JAVA 系统发生内部错误。

10 第一种情况:方法调用了本身会抛出异常的方法
import java.io.*; public class throwr { public static void main(String args[]) { char c; System.out.print("请输入一个字符: "); c=(char)System.in.read(); System.out.println("你输入的是: "+c); }} //类throwr调用了System.in.read()方法,其本身抛出了一个IOException 异常类。 // System.in.read()方法定义为:public abstract int read()throws IOException 运行结果:

11 C:\jdk\bin>javac throwr.java
throwr.java:6: 未报告的异常 java.io.IOException ;必须被捕获或被声明抛出 c=(char)System.in.read(); ^ 1 个错误 处理办法:1、捕获异常 (用try-catch)p19例 2、间接抛出: import java.io.*; public class throwr { public static void main(String args[])throws IOException { char c=‘ ’; System.out.print("请输入一个字符: "); System.out.println("你输入的是: "+c); }}

12 第二种情况,因程序功能,人为使用throw抛出。
需要利用程序来抛出。例如,用程序处理一个保存职工工资信息的文件,工资数据显然不为负,读文件时若发现负,则必须抛出一个异常来说明这个错误。 要抛出异常首先必须依据异常类创建一个异常对象。 格式: 异常类型 异常对象变量名=new 异常类型的构造方法() (异常类型的构造方法有两种:有参数串/无参数串) 例如:(DataFormatException---数据格式发生错误) DataFormatException e=new DataFormatException(“工资数据为负数”); throw e; (=throw new DataFormatException(“工资数据为负数”);)

13 例:某加工资的方法,保证工资必须是正增长 public int changegz(int jgz) throws DataFormatException{ if (jgz>=0){ 正常处理的语句;} else // 产生了非正常的情况,该抛出异常了。 {throw new DataFormatException(“工资数据为负数”);} return (oldgz+jgz); }

14 如果一个方法要抛出异常,方法体格式一般为:
public 方法返回值类型 方法名(方法的参数表)throws 异常类型{ 语句; if (正常情况){ 正常处理的语句;} else // 产生了非正常的情况,该抛出异常了。 { throw new 异常类型的构造方法();} return 正常返回值; } (注意:当这个方法发生了异常,不会向调用者返回值,所以return语句只需要考虑返回程序的正常结果)

15 创建异常类 虽然JAVA系统定义了很多异常类,但在实际设计时,可能遇到一些无法用它们来描述的错误。如,前面所说的工资为负,用DataFormatException---数据格式发生错误类型来描述有些牵强,这时,可自定义异常类型。 例题,ThrowTest.java 除0异常的创建和抛出

16 截获和处理异常 一旦方法抛出了异常,程序中应有对应的方法来截获这个异常并处理。否则,程序将终止运行。 截获和处理异常的简单格式: try { 正常语句; 可能产生异常的语句或方法调用;} catch(异常类型 异常对象变量) {对这个异常对象变量进行处理的语句;}; 例如: try{c=(char)System.in.read(); }catch(IOException e) {}; catch语句对try短语括号中的语句进行监视管理,其后的括号里是它所关心的异常类型,出现则被激活。

17 再例如:(截获多异常) try { anArray[i]=anArray[i+1]/intx; // 有可能下标出界,产生异常 // 也可能intx为0错误 } catch( ArrayIndexOutOfBoundsEcxeption e) { System.err.println(“……”); // 对异常的处理 } catch( ArithmeticException e1) { System.out.println(“除数为0错误!”)}

18 try必须与catch或finally中的一个配对使用
…… } catch (……){ …… } finally { finally语句定义一个总是执行的代码块,而不考虑异常是否被捕获。

19 使用异常处理的原则 考虑到异常处理机制时间开销大,异常处理应遵循以下原则。 1、能用条件判断来识别和处理就不用异常处理 try {a=inty/intx; catch( ArithmeticException e1) { System.out.println(“除数为0错误!”)} ====== a=inty/intx; if (intx=0){……} 2、尽量合并try语句 ,把多处错误尽可能放在一个try里。 3、对很少发生的异常不必处理,可用空的处理语句。

20 AccountOverdrawnException—当有了这个要取出比帐户上更多的钱的尝试时。
一级实验:处理一个异常 1. 编写程序,故意声明但不创建对象(不实例化),使产生NullPointerException(当对象没被实例化时,访问对象的属性或方法的尝试异常)。 使用try和catch语句捕获。 二级实验:创建自己的异常 创建银行顾客的类并附加下述异常: AccountOverdrawnException—当有了这个要取出比帐户上更多的钱的尝试时。 InvalidDepositException—当无效钱数(小于0)存入时。


Download ppt "异常及处理."

Similar presentations


Ads by Google