异常处理
本章要点
-
理解异常和错误处理
-
理解 JAVA 的异常层次结构及异常分类
-
掌握基本的异常处理编程
异常
-
异常(Exception)又称例外---是在程序运行过程中发生的、会打断程序正常执行的事件。
-
例如:除 0(ArithmeticException)、没有给对象开辟内存空间时会出现空指针异常(NullPointException)、文件找不到(FileNotFoundException)、数组元素下标越界(ArrayIndexOutOfBoundsException)等。这些事件的发生将阻碍程序的正常运行。为了增加程序的容错性、健壮性,程序设计时,必须考虑到可能发生的异常情况并做出相应的处理。
-
设计程序时必须考虑可能发生的异常事件并作出相应的处理。传统程序设计时,要由编程者自己测试出错发生的原因,通过 i f 语句判断是否出现了异常事件,并进行相应的处理。
-
传统异常处理存在的困难和问题
Ⅰ 写程序难
★ 大部分精力花在出错处理上了
Ⅱ 只把能够想到的错误考虑到
★ 对以外的情况无法处理
Ⅲ 程序可读性差
★ 大量的错误处理代码混杂在程序中
Ⅳ 出错返回的信息量太少
★ 无法更确切的了解错误状况或原因
异常层次结构及分类
Error与Exception
1.Throwable以下的异常都可以被捕获
2.所有Error类及其子类代表java运行时系统中可能发生的异常情况,是致命的,即程序遇到了非常严重的不正常状态,不能简单恢复执行,这就是错误。如:内存耗尽、系统内部错误等,通常我们(应用程序)不应捕获这些异常。
3.所有Exception类及其子类代表java程序中可能发生的异常情况,是非致命的,通过某种修正后程序还能继续执行。这类错误叫作异常。如:文件不存在、无效的下标、空引用、网络断开、打印机脱机、磁盘满了等,通常我们(应用程序)可以捕获这些异常。
Exception 分类
Exception 是要重点掌握的,它也分为两类:
(1)受控异常(检查异常):java 编译器对受控异常强制执行捕获或者声明
(2)不受控异常(非检查异常):java 编译器不会检查代码以确定是捕获或者声明不受控异常。尽管编译器对不受控异常没有捕获或者声明的强制要求,但在知道可能发生这种异常时应提供合适的异常处理代码。
|—— IOException
|—— AWTException
Exception ——|
|—— ClassNotFoundException
|—— NoSuchMethodException
不受控异常
异常处理
-
try-catch结构
-
try{
-
//可能产生异常的代码
-
}
-
catch(someException e){
-
//处理异常的代码
-
}
-
catch(someException e){
-
//处理异常的代码
-
}
-
try-catch-finally结构
-
try{
-
//可能产生异常的代码
-
}catch(someException e){
-
//处理异常的代码
-
} finally{
-
//必须执行的代码
-
}
异常处理
- 注意:
- catch和finally必须至少有一个跟在try 后面
- 如果不发生异常,则catch块中的代码不会被执行
- 不论是否发生异常finally块中的代码一定会被执行
自定义异常
用户为什么要自定义异常?
Java类库中定义的异常主要用来处理编程中一些常见的运行错误,这些错误是系统可以预见和自动识别的。
若用户程序有其特殊的逻辑要求,需要通过Java的异常处理机制来处理用户自定义的异常。
如何自定义异常?
- 创建一个类,必须继承Exception类
- 在可能抛出自定义异常方法的方法头中声明该异常
- 在方法体中指明需要抛出自定义异常对象的位置★ 创建异常对象★ 使用throw子句抛出异常
自定义异常(例)
在可能抛出自定义异常方法的方法头中声明该异常
public static void show(int score)
throws NumberRangeException{
if(score<0||score>100){
NumberRangeException e=
new NumberRangeException("输入的数字不在指定的范围!请重新输入。");
throw e;
}
else{
int s=score/10;
switch(s){
case 10:
case 9:System.out.println("A");break;
case 8:System.out.println("B");break;
case 7:System.out.println("C");break;
case 6:System.out.println("D");break;
default:System.out.println("E"); }
}
}
show()方法的调用
public static void main(String[] args) {
int score = Integer.parseInt(args[0]);
try{
show(score);
}catch(NumberRangeException e){
System.out.println(e.getMessage());
}
}
throws 与 throw
-
1.throws 用于抛出方法层次的异常,并且直接由这些方法调用异常处理类来处理该异常,所以它常用在方法的后面。比如 public static void main(String[] args) throws IOException
-
2.throw 用于方法块里面的代码,比 throws 的层次要低,表示它抛出异常, 但它不会处理它,而是由方法块的 throws Exception 来调用异常处理类来处理。