在实际工作中,我们遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求;你的程序要打开某个文件,这个文件可能不存在或者文件格式不对;你要读取数据库的数据,数据可能是空的;我们的程序再运行着,但是内存或硬盘可能满了等等。
软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是:Exception,意思是例外。遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理,安全的退出,而不至于程序崩溃呢?我们本章就要讲解这些问题。
如果我们要拷贝一个文件,在没有异常机制的情况下,我们需要考虑各种异常情况,伪代码如下:
伪代码使用if处理程序中可能出现的各种情况:
public class Test1 {
public static void main(String[] args) {
//将d:/a.txt复制到e:/a.txt
if("d:/a.txt"这个文件存在){
if(e盘的空间大于a.txt文件长度){
if(文件复制一半IO流断掉){
停止copy,输出:IO流出问题!
}else{
copyFile("d:/a.txt","e:/a.txt");
}
}else{
System.out.println("e盘空间不够存放a.txt!");
}
}else{
System.out.println("a.txt不存在!");
}
}
}
这种方式,有两个坏处:
1. 逻辑代码和错误处理代码放一起!
2. 程序员本身需要考虑的例外情况较复杂,对程序员本身要求较高!
那么,我们如何解决应对异常情况呢?Java的异常机制给我们提供了方便的处理方式。如上情况,如果是用Java的异常机制来处理,示意代码如下(仅限示意,不能运行):
try {
copyFile("d:/a.txt","e:/a.txt");
} catch (Exception e) {
e.printStackTrace();
}
异常机制本质
就是当程序出现错误,程序安全退出的机制。
异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。
在Java的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。
所谓异常处理,就是指程序在出现问题时依然可以正确的执行完。
我们开始看我们的第一个异常对象,并分析一下异常机制是如何工作的。
异常的分析:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入被除数:");
int numA=input.nextInt();
System.out.println("请输入除数:");
int numB=input.nextInt();
int result=numA/numB;
System.out.println(numA+"/"+numB+"="+result);
}
}
运行效果:
Java是采用面向对象的方式来处理异常的。处理过程:
1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。
2. 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。