一、什么是异常
异常就是一种对象(Exception),表示阻止程序正常执行的错误或情
- 在程序运行的过程中,如果JVM检测出一个不可能执行的操作,就会出现运行时错误
- 在Java中,运行时错误(Runtime Error)会作为异常(对象)抛出
- 如果异常没有被处理,程序将会非正常终止
异常处理 - 使程序可以继续运行或者优雅地终止
方法抛出异常,调用者可以捕获以及处理该异常
- 恢复正常的程序执行
- 进行日志处理
- 以某些方式提醒用户(错误提示、对话框等)
二、异常及异常处理
异常处理通常使用try-catch来实现。
下面一个异常处理的例子(5/0):
public class ExceptionDemo{
public static int division(int num1, int num2){
int result = Integer.MIN_VALUE;
try{ //监控异常
result = num1 / num2;
}catch(Exception e){ //捕获异常
e.printStackTrace(); //异常处理
}
return result;
}
public static void main(String[] args) {
int result = division(5, 0);
System.out.println("result = " + result);
}
}
三、异常处理机制
可以使程序处理非预期的情景,并继续正常的执行
组成:
- try:监控有可能产生异常的语句块
- catch:以合理的方式捕获并处理异常
- finally:不管有无异常,一定会执行的语句块(一般用来释放资源等)
- throw:手动引发异常
- hrows:指定由方法引发的异常
try{
//所监控的有可能产生异常的语句块
}catch(Exception e){//捕获异常,e是所捕获的异常对象
//异常处理:打印异常信息、日志记录等
}finally{
//不管有无异常,一定会执行的语句块(一般用来释放资源)
}
如果捕获的异常不匹配的话程序会直接中断执行
四、异常类的层次结构
Error:系统级的错误
- AwtError:界面的一些类库出现的错误
- LinkageError:类的依赖出现的错误
- VitualMachineError:虚拟机错误
**Exception:**可捕获可处理的异常 - AWTException:界面的组件出现的错误
- SQLException:连接数据库时出现的错误(例如语句错误)
- IOException:文件错误出现的错误
- RunTimeException:运行时异常(特殊,可以不捕获)
五、常见的异常类型
六、多重catch块
try块中的代码可能会引发多种类型的异常
当引发异常时,会按catch的顺序进行匹配异常类型,并执行第一个匹配的catch语句
try {
int num1 = Integer.parseInt(strNum1);
..........................................
} catch (InputMismatchException e) {
e.printStackTrace();
} catch (ArithmeticException e) {
e.printStackTrace();
}
//JDK7后的简化写法(multi-catch feature)
catch(Exception1 | Exception2 | Exception3 | .. ex){}
七、try-catch-finally
确保无论是否发生异常, finally块中的代码总能被执行
注意:
- 遇到System.exit(0)语句时是不执行finally块 的唯一情况(即使在有return的时候)
- 使用finally块的场合:如果程序开启了相关资 源(文件、数据库等),为了避免因出现错误没 有关闭,就可以使用finally块在执行完毕后强制 要求关闭所有打开的资源
- 使用finally时,可以省略catch块
八、声明、抛出、捕获异常
声明异常(Declaring Exception)
- 每个方法都必须声明它可能抛出的必检异常的类型,这称为声明异常
- 不要求显式声明Error和RuntimeException(免检异常),其他异常必须在方法头显式声明
method() throws Exception1, Exception2, Exception3...//声明异常
public static void main(String[] args) {
try {
//谁调用,谁处理
//调用者捕获并处理异常
//或继续抛出异常(链式异常)
} catch (Exception e)
{ e.printStackTrace(); }
}
九、自定义异常类
可以通过继承Exception类来定义一个自定义异常类
- 尽量使用Java中提供的异常类而不要创建自己的异常类
- 如果遇到一个不能用预定义异常类恰当描述的问题,可以创建自定义异常类
public class cz extends Exception{
//重写父类的两个构造方法即可
}