本章主要内容:
- 异常的定义与分类
- try-catch-finally语句
- 抛出异常的方式
- 自定义异常类的方式
异常的定义与分类
异常的定义:在程序运行中有代码产生的一种错误。
异常的分类:异常类可以分为两大类,分别为java.lang.Exception与java.lang.Error类。
详细分类如下图:
Try-catch-finally语句
在Java语言中,异常处理是通过try,catch,finally,throw,throws五个关键字来实现的。
在Java语言的异常处理机制中,提供了try-catch-finally语句来捕获和处理一个或多个异常,其语法格式如下:
try语句块用来启动Java的异常处理机制,可能抛出异常的语句包括throw语句,调用可能抛出异常的方法的方法调用语句,这些都应该包含在这个try语句块中;catch语句块紧跟在try语句块的后面,用来指定需要捕获的异常类型。若抛出的异常对象属于catch后面括号内欲捕获的异常类,则catch会捕获此异常,然后进入到catch块内继续执行;无论try程序块是否捕获到异常,或者捕获到的异常是否与catch后面括号里的异常相同,最后一定会运行finally块里的程序代码;finally块的代码运行结束后,程序再转到try-catch-finally块之后的语句继续运行。
抛出异常的方式
抛出异常有以下两种方式:(1)系统自动抛出异常。(2)指定方法抛出异常。
所有系统定义的运行时异常都可以由系统自动抛出。而指定方法抛出异常需要使用关键字throw或throws来明确指定在方法内抛出异常。
1.抛出异常的方法与调用方法处理异常
1)抛出异常的方法
如果在一个方法内部的语句执行时可能引发某种异常,但是并不能确定如何处理,则此方法应声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。也就是说,方法中的异常没有用try-catch语句捕获异常和处理异常的代码。一个方法声明抛出异常有如下两种方式。
- 方式一:在方法体内使用throw语句抛出异常对象。其语法格式为:throw 由异常类所产生的对象;
其中,“由异常类所产生的对象”是一个从Throwable派生的异常类对象。
- 方式二:在方法头部添加throws子句表示方法将抛出异常。带有throws子句的方法声明格式如下:[修饰符] 返回值类型 方法名 ([参数列表]) throws 异常类列表
其中,throws是关键字,“异常类列表”是方法中可能抛出的异常类,当异常类多于一个的时候,要用逗号“,”隔开。
2)处理异常的方法
如果某个方法声明抛出异常,则调用它的方法必须捕获并处理异常,否则会出现错误。
2.由方法抛出异常交系统处理
对于程序需要处理的异常,一般编写try-catch-finally语句捕获并处理,而对于程序中无法处理必须交由系统处理的异常,由于系统直接调用的是主方法main(),所以可以在主方法头使用throws子句声明抛出异常交由系统处理。
针对 IOException 类的异常处理,编写的方式也有三种:
- 直接由主方法main()抛出异常,让Java默认的异常处理机制来处理,即若在主方法main()内没有使用try-catch语句捕获异常,则必须在声明主方法main()头部的后面加上throws IOException 子句。
- 在程序代码内编写try-catch语句来捕获由系统抛出的异常,如此则不用指定main0 throws IOException 抛出异常了;
- 既在main()方法头的后面使用throws IOException 抛出异常,也可以在程序中使用用try-catch语句来捕获由系统抛出的异常。
自定义异常类的方式
系统定义的异常类主要用来处理系统可以预见的较常见的运行错误,对于某个应用程序所特有的运行错误,则需要编程人员根据程序的特殊逻辑关系在用户程序里自己创建用户自定义的异常类和异常对象。
创建用户自定义异常时,一般需完成如下工作。
- (1)声明一个新的异常类。用户自定义的异常类必须是Throwable类的直接或间接子类。Java推荐用户自定义的异常类以Exception为直接父类,也可以使用某个已经存在的系统异常类或用户自己定义的异常类为其父类。
- (2)为用户自定义的异常类定义属性和方法,或覆盖父类的属性和方法,使这些属性和方法能够体现该类所对应的错误信息。习惯上是在自定义异常类中加入两个构造方法,分别是没有参数的构造方法和含有字符串型参数的构造方法。
针对特定的异常,只有定义了相应的异常类,系统才能识别这些特定的运行异常,这样才能及时地控制和处理这种特定的异常,所以定义足够多的异常类是构建一个稳定完善的应用系统的重要基础之一。
通过本章的讨论,可以看出对异常的处理不外乎两种方式:
- 在方法内使用try-catch语句来处理方法本身所产生的异常。
- 如果不想在当前方法中使用try-catch语句来处理异常,可在方法声明的头部使用throws语句或在方法内部使用throw语句将它送往上一层调用机构去处理。
对于非运行时异常,Java要求必须进行捕获并处理,而对运行时异常则不必,可以交给Java运行时系统来处理。异常处理是Java程序设计非常重要的一个方面,本章详细地讲述了Java异常处理的有关知识。针对程序中出现的异常问题,用Java异常处理机制进行处理,不仅提高程序运行的稳定性、可读性,而且能够以与程序设计人员独立的方式进行程序的异常情况处理,有利于程序版本的升级。
(本文内容均来自《Java程序设计基础(第六版)》。此文仅为学习总结。)