文章目录
- 异常处理的概念
- 异常的基本概念
- Java异常处理机制的优点
- 错误的分类
- 异常的分类
- 预定义的一些常见异常
- 异常的处理
- 抛出异常
- 捕获异常的语法
- 生成异常对象
- 声明自己的异常类
异常处理的概念
在程序在运行的时候可能会出现错误,程序要有能力处理错误,或者至少要知道发生的什么错误。
异常的基本概念
- 又称为例外,是特殊的运行错误对象
- Java中声明了很多异常类,每个异常类都代表了一种运行错误,
类中包含了- 该运行错误的信息
- 处理错误的方法
- 每当Java程序运行过程中发生一个可识别的运行错误时,即该
错误有一个异常类与之相对应时,系统都会产生一个相应的该
异常类的对象,即产生一个异常。
Java异常处理机制的优点
- 将错误处理代码从常规代码中分离出来;
- 按错误类型和差别分组;
- 对无法预测的错误的捕获和处理;
- 克服了传统方法的错误信息有限的问题;
- 把错误传播给调用堆栈。
错误的分类
- 根据错误的严重程度不同,可分为两类
- 错误
- 致命性的,程序无法处理;
- Error类是所有错误类的父类。
- 异常
- 非致命性的,可编制程序捕获和处理;
- Exception类是所有异常类的父类。
- 错误
异常的分类
- 非检查型异常
- 不期望程序捕获的异常,在方法中不需要声明,编译器也不进行检查。
- 继承自RuntimeException。
- 不要求捕获和声明的原因:
- 引发RuntimeException的操作在Java应用程序中会频繁出现。例如,若每次使用对象时,都必须编写异常处理代码来检查null引用,则整个应用程序很快将变成一个庞大的try- catch块。
- 它们表示的问题不一定作为异常处理。如:可以在除法运算时检查o
值,而不使用ArithmeticException。可以在使用引用前测试空值。
- 检查型异常
- 其他类型的异常。
- 如果被调用的方法抛出一个类型为E的检查型异常,那么调用者必须捕获E或者也声明抛出E (或者E的一一个父类), 对此编译器要进行检查。
预定义的一些常见异常
Java预定义的一些常见异常
- 非检查型异常
- ArithmeticException
整数除法中除数为o - NullPointerException
访问的对象还没有实例化 - NegativeArraySizeException
创建数组时元素个数是负数 - ArrayIndexOutOfBoundsException
访问数组元素时,数组下标越界
- ArithmeticException
- 检查型异常
- ArrayStoreException
程序试图向数组中存取错误类型的数据 - FileNotFoundException
试图存取一个并不存在的文件 - IOException
通常的I/O错误
- ArrayStoreException
例:非检查型异常——数组越界异常
HelloWorld.java
import java.io.*;
public class HelloWorld {
public static void main (String args[ ]) {
int i= 0;
String greetings[] = {"Hello world!", "No, I mean it!", "HELLO WORLD!!"};
while(i < 4){
System.out.println (greetings[i]);
i++;
}
}
}
程序定义了3个字符串,但是循环进行了4次,导致数组越界,所以在运行后会出现一个异常信息,并结束程序的运行。
异常的处理
检查型异常的处理
- 声明抛出异常
- 不在当前方法内处理异常,可以使用throws子句声明将异常抛出到调用方法中;
- 如果所有的方法都选择了抛出此异常,最后JVM将捕获它,
输出相关的错误信息,并终止程序的运行。
- 捕获异常
- 使用try{}catch(){}块,捕获到所发生的异常,并进行相应的
处理
- 使用try{}catch(){}块,捕获到所发生的异常,并进行相应的
抛出异常
当探测到异常时,方法可能会选择不处理异常,而是抛出异常给调用它的方法。
- 抛出异常的例子
public void openThisFile(String fileName) throws java.io.FileNotFoundException {
//code for method
}
public void getCustomerInfo() throws java.io.FileNotFoundException {
// do something
this.openThisFile(" customer.txt");
// do something
}
如果在openThisFile中抛出了FileNotfoundException异常, getCustomerInfo将停止执行,并将此异常传送给它的调用者.
捕获异常的语法
try {
statement(s)
} catch (exceptiontype name) {
statement(s)
} finally {
statement(s)
}
说明
- try语句
- 其后跟随可能产生异常的代码块。
- catch语句
- 其后跟随异常处理语句,通常都要用到两个方法:
- getMessage() 返回一一个字符串,对发生的异常进行描述。
- printStackTrace() 给出方法的调用序列,一直到异常的产生位置。
- finally语句
- 不论在try代码段是否产生异常,finally 后的程序代码段都会被执行。通常在这里释放内存以外的其他资源。
注意事项
- 如果并列有多个catch语句捕获多个异常,则一般的异常类型放
在后面,特殊的放在前面。
生成异常对象
- 三种方式
由Java虚拟机生成;
由Java类库中的某些类生成;
在自己写的程序中生成和抛出异常对象。 - 抛出异常对象都是通过throw语句实现,异常对象必须是Throwable或
其子类的实例:
throw new ThrowableObject();
ArithmeticException e = new ArithmeticException0; throw e;
声明自己的异常类
- 自定义的所有异常类都必须是Exception的子类
- 声明语法如下
public class MyExceptionName extends SuperclassOfMyException {
public MyExceptionName( {
super("Some string explaining the exception");
}
}