一、异常处理
JAVA语言采用异常来处理系统级和应用程序级的错误状态,是一种结构化的、统一的、类型相对安全的处理机制。在运行过程中,如果产生错误则抛出异常;通过try语句来定义代码块运行可能出现异常的代码块。通过catch语句可以捕获特定的异常定执行相应的处理。通过finally语句可以保证即使处理失败,也可以释放掉资源。
基于异常处理的机制的错误处理方式,可以把错误处理和正常代码逻辑分开,更高效地实现错误处理,增加程序的可维护性。现在异常处理机制的错误处理方式,已成为许多现代程序设计语言处理错误的方式标准模式。
二、JAVA异常类
异常即异常事件。在程序运行过程中,如果某个方法出现了错误,可以通过创建异常类对象(exception object),并通过throw语句将创建的异常抛出给系统运行时,及程序运行终止流程,转而执行异常处理流程。
异常对象是异常类的实例,JAVA异常都继承Throwable。
JAVA异常类的层次结构
Throwable是所有异常类的父类,只有该类或它的子类才可以做catch的参数。
三、抛出异常
public static int fun(int a,int b){
if(b == 0){
throw new UnsupportedOperationException("被除数不能为0!!!");
//Exception in thread "main" java.lang.UnsupportedOperationException: 被除数不能为0!!!
// at com.test.test_exception.Test.fun(Test.java:7)
// at com.test.test_exception.Test.main(Test.java:14)
}
int c = a / b;
return c;
}
创建异常类
如果遇到任何标准异常类都不能够充分描述清楚的问题,在这种情况下创建自己的异常类
定义一个派生于Exception的类,或者派生于Exception子类的类。
class FileFormatException extends IOException{
//包含两个构造器
//默认构造器
public FileFormatException() {
}
//带有详细描述信息
public FileFormatException(String message) {
super(message);
}
}
四、捕获异常
想要捕获一个异常必须设置try/catch语句块
如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么:
(1)程序将跳过try语句块的其余代码
(2)程序将执行catch子句中的处理器代码
如果方法中的代码抛出了一个在catch子句中国没有声明的异常类型,那么这个方法就会立刻退出(希望调用者为该类型一场涉设计catch子句)
public static int fun(int a,int b){
try{
int c = a / b;
return c;
}catch (ArithmeticException e){
System.out.println("捕获异常!!!");
return 0;
}
}
public static void main(String[] args) {
System.out.println(fun(10,0));
// 捕获异常!!!
// 0
}
捕获多个异常
在一个try语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理,可以为每个异常类型使用一个单独的catch子句:
五、finally子句
——释放资源
不管是否有异常被捕获,finally子句中的代码都被执行。
——执行finally子句的3种情况:
(1)代码没有抛出异常
在这种情况下,程序首先执行try语句块中的全部代码,然后执行finally子句中的代码,随后继续执行try语句块之后的第一条语句
(2)抛出一个在catch子句中捕获的异常
在这种情况下,程序将执行try语句块中的所有代码,知道发生异常为止。然后跳过try语句块中的剩余代码,转至与该异常匹配的catch子句中的代码,最后执行finally子句中的代码
(3)抛出了一个异常,但是不是由catah子句捕获的
在这种情况下,程序将执行try语句块中的所有语句,知道异常被抛出为止。然后将调过剩余代码,执行finally子句中的代码,并将异常抛给这个方法的调用者。
——注:当finally子句中包含return语句时
在方法返回前,finally子句中的return语句会被执行,这个返回值会覆盖掉原来的返回值。