1、第18讲 异常,4.5 异常,知识回顾,抽象类 抽象方法:用abstract修饰,没有方法体声明的方法 抽象类:用abstract修饰的类 抽象类不能实例化,只能通过子类实例化 接口 接口用interface声明 接口中所有的变量都默认为public static final,所有的方法默认为public abstract 接口可以多继承 接口只能通过实现类进行实例化,实现类的定义通过“implements 接口列表 ”短语来实现,知识回顾,多态 多态概念 同一种操作作用于不同对象会有不同解释或不同执行结果。 对象类型转换 “子类/实现类”的对象可以用“父类/接口”类型变量去引用,但是只能引用
2、“父类/接口”中声明过的方法,不能引用“子类/实现类”中新定义的方法 若想引用“子类/实现类”对象中定义的方法,必须使用类型转换,将其转换为“子类/实现类”的类型。 instanceof关键字 运算符,判断一个对象是否为某个类的实例 Object类 所有类的父类,作业中的问题,作业点评: 26刘小敏,第二题 17李娜,第3题可以改进 34宋振朝,第1题可改进,第3题可改进 09郭威锋,Perfect 60赵晓蓉,第2题 39王晨,Excellent,第3题可稍改进,本讲要点,【要点】 异常的概念 try.catch.finally throws关键字 运行时异常与编译时异常 自定义异常 【教学
3、目标】理解Java中异常的处理机制,掌握异常的捕获处理,掌握异常的抛出以及自定义异常类的方法。,4.4 异常(Exception)- 4.5.1 什么是异常,【异常的概念】程序设计错误有两种:编译时错误、运行时错误,前者容易发现,后者不易发现。如:,程序编译时无错 运行时错误,程序无法继续运行,例1:被0除错误,4.4 异常(Exception)- 4.5.1 什么是异常,例2:访问空对象,4.4 异常(Exception)- 4.5.1 什么是异常,【异常】异常是指在程序执行过程中,发生的这种不正常的状况,比如被零除、数组访问越界、访问空对象、网络连接中断等引发的错误。 【异常类】在Java
4、语言中,以异常类的形式对这些非正常情况进行封装。通过异常处理机制对程序运行时发生的各种问题进行处理。 如例1、例2中我们看到的的空指针异常类:java.lang.NullPointerException,数学异常类java.lang.ArithmeticException,4.4 异常(Exception)- 4.5.1 什么是异常,【异常类“家族”】除了NullPointerException、ArithmeticException异常类之外,在Java中还提供了大量的异常类,这些类都继承自java.lang.Throwable类。Throwable类的继承体系图如下:,4.4 异常(Exc
5、eption)- 4.5.1 什么是异常,Throwable有两个直接子类Error和Exception,其中Error代表程序中产生的错误,Exception代表程序中产生的异常。 【Error】称为错误类,包含Java系统或执行环境会发生的异常,如内存溢出、类文件格式错误等。这一类错误由Java运行系统处理,不需要我们去处理(如在盖楼的过程中因偷工减料,导致大楼坍塌,就相当于一个Error)。 使用java命令去运行一个不存在的类就会出现Error错误,如下图所示:,4.4 异常(Exception)- 4.5.1 什么是异常,【Exception】包含了一般性的异常,这些异常在程序中是可
6、以捕获并处理的(在开发Java程序中进行的异常处理,都是针对Excption类及其子类) 【 Throwable类的方法 】参考JavaAPI文档 String getMessage() 一返回此throwable对象的详细消息字符串 void printStackTrace()将此 throwable 及其追踪输出至标准错误流 void printStackTrace(PrintStream s)将此 throwable 及其追踪输出到指定的输出流 String toString()返回此 throwable 的简短描述,4.4 异常(Exception) 4.5.2 trycatch和fi
7、nally,【异常处理机制】在上例中,程序产生异常时会立刻停止运行,但实际应用中,不希望程序完全停止,而是希望能对异常进行处理,程序可以继承运行。为解决此问题,Java中采取“监视捕获处理”的思想来处理程序的异常。实现这个机制的语句就是:try catch finally,4.4 异常(Exception) 4.5.2 trycatch和finally,【trycatch和finally语句格式】 格式1:trycatch 格式2:trycatchfinally,try/可能发生异常的程序代码 catch(Exception或其子类名 e)/捕获/处理异常的代码,如输出异常信息 ,4.4 异常
8、(Exception) 4.5.2 trycatch和finally,【异常捕获与处理过程】,当try代码块中程序发生了异常,系统将这个异常发生的代码行号、类别等信息封装到一个异常对象中,并将这个对象传递给catch代码块。catch关键字后跟有一个用括号括起来的Exception类型的参数e,e就是接收这个异常对象的变量名。在catch代码块中通过对异常对象的操作来处理异常。,4.4 异常(Exception) 4.5.2 trycatch和finally,例3:使用try.catch语句对例1中出现的异常进行捕获,4.4 异常(Exception) 4.5.2 trycatch和final
9、ly,【注意】在try代码块中,发生异常语句后面的代码是不会被执行的,如本例中第7行代码的打印语句就没有执行。,4.4 异常(Exception) 4.5.2 trycatch和finally,try/可能发生异常的程序代码 catch(Exception或其子类名 e)/捕获/处理异常的代码,如输出异常信息 finally/无论是否发生异常都要执行的程序代码 ,在程序中,有时候我们希望有些语句无论程序是否发生异常都要执行,这时就可以在trycatch语句后,加一个finally代码块。,4.4 异常(Exception) 4.5.2 trycatch和finally,例4:修改例2程序,4.
10、4 异常(Exception) 4.5.2 trycatch和finally,注意: 当try.catch中执行了System.exit(0)语句时,finally语句块不会执行。 System.exit(0)表示退出当前的Java虚拟机,Java虚拟机停止了,任何代码都不能再执行了。,4.5 异常(Exception)-4.5.3 throws关键字,【throws 短语抛出异常】如果在一个方法中有些语句可能会产生异常,而我们又不想在该方法中去处理,此时我们可以在声明此方法时抛出这个异常,并要求由调用它的方法去处理。在方法声明时使用throws短语抛出异常。如果在调用方法中还是不想处理,则可
11、以继续在声明方法的后面使用throws短语抛出。修饰符 返回值类型 方法名(参数变量列表) throws 异常类列表,4.5 异常(Exception)-4.5.3 throws关键字,例5:修改例3,在divide方法中执行return x/y;语句时有可能会出现异常,我们定义divide方法是抛出这个异常,4.5 异常(Exception)-4.5.3 throws关键字,当在divide()方法中抛出异常后,要求在调用这个方法时去处理(用trycatch语句处理)。如下:,4.5 异常(Exception)-4.5.3 throws关键字,当在divide()方法中抛出异常后,也可以在当
12、前的方法中继续抛出异常。如下:,4.5 异常(Exception)-4.5.3 throws关键字,【异常的捕获过程】当异常发生时,异常机制判断是否有相应的异常捕获器对异常进行了捕获处理,如果没有处理,则沿着方法的调用栈找上一级方法,看上一级方法对异常是否进行了处理,以此类推,一直沿着调用栈上溯,若直到主程序方法还没有对异常处理,则由系统默认的处理器进行处理。,4.5 异常(Exception)-4.5.3 throws关键字,使用Eclipse工具编写程序,可以帮我们生成异常处理代码当在编辑视图左侧标志栏的“红叉”单击时,会弹出一个辅助快捷菜单,本例中可以有两个操作选择:Add throws
13、 declaration、Surround with try/catch,4.5 异常(Exception)-4.5.5 自定义异常,尽管Java的内置异常能够处理大多数常见错误,你也许希望创建自己的异常类型来处理特殊情况。用户可以通过继承现有的异常类来建立自己的异常类。 例6:创建一个异常类,用于描述负数异常。在特定的程序中,要求某个操作数不能为负,为负时抛出这个类的对象。,4.5 异常(Exception)-4.5.5 自定义异常,在实际开发中,如果没有特殊的要求,自定义的异常类只需继承Exception类,在构造方法中使用super()语句调用Exception的构造方法即可。 【自定义
14、异常类的使用】 既然自定义了异常,那么该如何使用呢?使用throw语句 throw用于在程序中主动抛出异常对象,其语法格式如下:throw 异常类对象;,4.5 异常(Exception)-4.5.5 自定义异常,例7:上例中创建了异常类MinusException,本例中使用这个异常类。 【思路】 (1)创建一个静态方法 double getCircleLength(double r)方法,在方法体中判断如果r是小于0的数,则抛出一个MinusException异常(相当于方法内部抛出异常信息),且在本方法中不处理(方法定义时需要抛出这个异常) (2)在main方法中调用这个方法,分别传递5
15、和-5这两个数,调用这两个方法时需要捕获异常并处理。,4.5 异常(Exception)-4.5.5 自定义异常,public class Example186 public static void main(String args) try System.out.println(getCircleLength(-5); catch (MinusException e) System.out.println(e.getMessage();try System.out.println(getCircleLength(5); catch (MinusException e) System.out.
16、println(e.getMessage();public static double getCircleLength(double r) throws MinusException if(r=0)throw new MinusException(“长度出现小于零的异常“);return 2*3.14*r;,本讲小结,异常处理机制:监视(抛出异常)捕获处理 监视(抛出):try 自动抛出:如果运行时发生错误,系统创建一个异常对象抛出。 强制抛出:throw语句可以强制抛出一个异常。 捕获处理:catch(异常类型 对象名),在catch语句块中进行处理。 throws短语 如果不在方法中直接处理可能发生的异常,可以声明方法时加上throws短语,而要求在调用这个方法时捕获这个异常并处理。(当然,调用这个方法的方法也可以再次将异常抛出) throw语句 在程序中抛出自定义的异常对象,作业,关键字:try catch finally throws throw 4.9习题,