1 / 20

异常及处理

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

spike
Download Presentation

异常及处理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

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-157-158 Throwable Error Exception ………… R ArithmeticException 算术错误 NumberFormatException IOException 输入输出错误 ClassNotFountException

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

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

  9. 第一种情况:方法调用了本身会抛出异常的方法第一种情况:方法调用了本身会抛出异常的方法 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 运行结果:

  10. 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("请输入一个字符: "); c=(char)System.in.read(); System.out.println("你输入的是: "+c); }}

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

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

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

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

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

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

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

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

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

More Related