您的位置:首页 > 编程语言 > Java开发

Java异常处理机制

2015-05-22 22:02 267 查看


Java异常处理机制

如果没有异常机制的存在,我们就可能需要很多的if…else…等语句来处理或避免一些问题的发生,这样会导致异常处理代码和功能逻辑代码混合在一起,不利于阅读和后期的修改。所以我们为了解决这个问题呢,就用到了Java的异常处理机制


1.   什么是异常?

从字面理解,就是程序在运行的时候出现了未预料到的情况,也就是程序出现了问题。这个问题按照Java面向对象思想进行描述,并封装成了一个个的异常对象(因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在,所以当出现多属性信息最方便的方式就是将这些信息进行封装;这样就方便于操作问题以及处理问题)。


2.   异常的层次关系





3.   异常的分类

1)        编译时异常(编译时需要处理):

这类异常在编译时,如果没有处理(没有抛出也没有用try捕捉),就会编译失败。

2)        运行是异常(编译时不需要处理):

在编译时,不需要处理,编译器不检查;

这类异常的发生,建议不要处理,让程序停止,需要对代码进行修正。

例如:

package learn.exception;
/*继承自运行时异常*/
class MyRuntimeException extends RuntimeException {
MyRuntimeException(String msg) {
super(msg);
}
}

public class Test {
public static void main(String[] args) {
try {
show(true);
} catch (MyRuntimeException e) {
System.out.println(e);
}
}

public static void show(boolean b) {
/*运行时异常不用再这里进行捕获*/
if (b)
throw new MyRuntimeException("值为true");
}
}


注意:

1)  如果Exception在内部被处理,比如内部catch(捕获)并对异常进行了处理,则该方法不用声明异常。catch是用于处理异常,如果没有catch就代表异常没有被处理。

2)  如果该异常是检测,可以没有catch语句。

3)  当然:如果抛出的是多个异常,就要有几个catch,也有简单的做法,直接抛父类异常Exception


4.   异常的处理原则

1)        处理方式分为try…catch捕获处理和throws抛出给外层处理

a)     捕捉

对于捕捉:java有针对性的语句块进行处理。

try {
//需要被检测的代码;
}
catch(Exception e){
//异常处理代码;
}
fianlly{
//一定会执行的代码(可以在这里执行关闭资源等关键操作)
}


b)     抛出
在方法名后使用throws关键字对一场进行声明

2)        调用到抛出异常的功能时,抛出几个异常,就处理几个异常,也就是一个try捕捉对应多个catch处理

3)        当有多个catch时,处理父类异常的catch放在最下面。

4)        在catch语句中,不要简单写一些异常输出语句(如printStacktrace())或者是什么都不写,而需要有针对性的异常处理方式。当捕获到的异常本功能无法处理时,可以继续抛出给外层处理。

5)        catch和throws的使用情况

a)        功能内部可以解决,用catch捕捉;

b)        功能内部解决不了,用throws把异常告诉调用者,由调用者解决。


5.   异常的其他知识

1)        finally语句块

a)        finally语句中定义的是一定要执行的语句,通常用于关闭资源。(因为资源必须释放)

b)        finally除非遇到System.exit(0);也是就虚拟机退出才不会执行。

c)        如果在catch语句中发生了异常,finally语句也会执行。并且如果在catch语句中也有用try-catch-finally捕获异常,finally由内到外一级一级执行完,例如:

package learn.exception;

public class Main {

public static void main(String[] args) {

try {
int c = 1 / 0;
System.out.println("try c" + c);
} catch (Exception e) {
try {
int a = 1 / 0;
System.out.println("catch a" + a);
} catch (Exception e1) {
try {
int a = 1 / 0;
System.out.println("catch a" + a);
} catch (Exception e2) {
int b = 1 / 0;
System.out.println("catch2 b" + b);
} finally {
System.out.println("finally1");
}
} finally {
System.out.println("finally2");
}
} finally {
System.out.println("finally3");
}
}
}


执行结果为:

finally1
finally2
finally3


2)        子类覆盖父类时对异常处理的注意事项:

a)        如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。

b)        如果父类方法抛出多个异常,那么子类再覆盖该方法时,只能抛出父类异常的子集。

c)        (也就是父类如果抛多个异常,那么我们不能直接抛Exception异常;如果抛一个异常的时候,是可以抛父类异常的)

d)        如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。

e)        如果子类方发发生了异常,就必须要进行try处理,绝对不能抛。

f)         如果在子类的覆盖方法确实需要抛出非父类的异常或者该异常的子类,则必须在内部解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 编程语言