一枚c/c++程序员java探索-异常处理

概念

  1. Java异常是Java提供处理程序中错误的一种机制。
  2. 错误是指在程序运行过程中发生地一些异常事件。
  3. Java程序运行过程中如出现异常事件,可以生成一个异常对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,这个过程称为抛出(throw)异常。
  4. 当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常
1
2
3
4
5
6
7
8
9
10
11
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3}; //定义一个数组
System.out.println(arr[3]); //数组下标越界,错误
try { //尝试运行括号里的代码
System.out.println(2 / 0);
} catch (ArithmeticException ae) {//捕获
ae.printStackTrace();//打印错误信息
}//ae是系统自己定义的异常对象的名字
}
}

异常分类

  1. Throwable//所有异常类的父类
  2. Error//称为处理不了的错误
  3. Exception//能处理的错误(除Runtime Exception外的异常,必须处理)
  4. 在Exception中还包括一类特殊的异常(Runtime Exception),它可以处理,也可以不处理。

Finally关键字

Finally段的代码无论是否发生异常都有执行

抛出和捕获异常

把异常交给JVM处理

1
2
3
4
5
6
7
8
9
10
11
public class ExceptionTest {
public static void execute() throws Exception {
System.out.println("execute...");
throw new Exception();
}
public static void main(String[] args) throws Exception {//自己不想处理,叫给上一层处理, 现在上一层是jvm
execute();
}
}

自定义异常

  1. 自定义异常类可以继承Throwable类或者Exception类,而不要继承Error类。自定义异常类之间也可以有继承关系
  2. 需要为自定义异常类设计构造方法,以方便构造自定义异常对象。
    若要在异常中添加附加信息,则可以为类添加一些变量和方法。本例演示的自定义异常没有按照业务类型来命名,而是创建一个通用异常类,以retCd来区别发生异常的业务类型与发生位置,当然对于具体的retCd值,事先必须有具体的规定或说明。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 多数情况下,创建自定义异常需要继承Exception,本例继承Exception的子类RuntimeException
* @author Mahc
*
*/
public class CustomerException extends RuntimeException {
private String retCd ; //异常对应的返回码
private String msgDes; //异常对应的描述信息
public CustomerException() {
super();
}
public CustomerException(String message) {
super(message);
msgDes = message;
}
public CustomerException(String retCd, String msgDes) {
super();
this.retCd = retCd;
this.msgDes = msgDes;
}
public String getRetCd() {
return retCd;
}
public String getMsgDes() {
return msgDes;
}
}

注意事项

当使用多个catch语句块来捕获异常时,需要将父类的catch语句块放到子类型的catch块之后,这样才能保证后续的catch可能被执行,否则子类型的catch将永远无法到达,Java编译器会报编译错误。

如果try语句块中存在return语句,那么首先会执行finally语句块中的代码,然后才返回。

如果try语句块中存在System.exit(0)语句,那么久不会执行finally语句块的代码了,因为System.exit(0)会终止当前运行的JVM。程序在JVM终止前结束执行。

JasonThink wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!