Java异常
异常框架

Throwable接口
Throwable是Java语言中所有错误或异常的超类。Throwable包含两个子类:Error和Exception。
Error
指合理的应用程序不应该试图捕获的严重问题,程序自身无法修复这些错误。编译器不会检查此类异常。
Exception
与Error对应,指的是合理的应用程序要捕捉的异常条件。分为被检查的异常(Checked Exception)和运行时异常(Runtime Exception)。
Checked Exception
Exception类本身,以及Exception的子类中除了运行时异常之外的其它子类都属于被检查异常。Java编译器会对此异常进行检查。此类异常,必须通过throws声明抛出异常或通过try-catch对异常进行捕获处理,才可以通过编译。被检查异常通常可以恢复。
Runtime Exception
RuntimeException及其子类都被称为运行时异常。当程序中可能出现这类异常时,即使没有通过throws声明抛出,也没有用try-catch语句进行捕捉,还是会编译通过,也就是说,Java编译器不会检查此类异常。但是此类异常还是可以通过throws声明或try-catch语句进行抛出。如果产生运行时异常,则需要通过修改代码来进行避免。
关键字
Java异常是Java提供的一种识别及响应错误的一致性机制。异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。
- try:try语句块中放入可能抛出异常的语句。
- catch:catch语句块用来捕获try语句块中抛出的异常。
- finally:finally语句块中的代码总会被执行,主要用于回收在try块里打开的物力资源(数据库连接,网络连接或磁盘文件等)。
- throw:用于抛出异常。
- throws:用于声明抛出的异常。
例1 try、catch和finally
public class exceptionTest {
public static void main(String[] args) {
System.out.println(func());
}
public static int func() {
// try语句块发生异常之后,异常语句后的剩余内容就不会再被执行了
try {
int i = 10 / 0;
System.out.println("剩余内容");
// 捕捉抛出的异常
} catch (Exception e) {
System.out.println("catch");
System.out.println(e.getMessage());
System.out.println(e.toString());
System.out.println();
return 0;
// finally语句块总是会被执行。
// 如果有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,
// 如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
} finally {
System.out.println("finally");
return 2;
}
}
}
以下是执行结果:
catch
/ by zero
java.lang.ArithmeticException: / by zero
finally
2
可以看出,try快中抛出异常后,异常语句后的内容不再执行;接下来到执行catch块,当catch块中有return语句而且又有finally块时,先执行finally块中的语句;执行finally块中的语句时,其中有return语句,执行完return语句后就不再回到catch语句,而是整个方法执行完毕。
如果把finally块中的return语句注释掉,再次执行,效果就是finally块中的语句先执行,再回到catch块中执行return语句。
catch
/ by zero
java.lang.ArithmeticException: / by zero
finally
0
例2 throw和throws
public class exceptionTest1 {
public static void main(String[] args) {
try {
test();
} catch (MyException e) {
e.printStackTrace();
}
}
// test()的try语句块中产生ArithmeticException异常(除数为0),并在catch中捕获该异常;
public static void test() throws MyException {
try {
int i = 20 / 0;
} catch (ArithmeticException e) {
// 接着抛出MyException异常。main()方法对test()中抛出的MyException进行捕获处理。
throw new MyException("This is MyException");
}
}
}
/**
* MyException是继承于Exception的子类。
*/
class MyException extends Exception {
MyException(String msg) {
super(msg);
}
}
以下是执行结果:
com.exceptionTest0.MyException: This is MyException
at com.exceptionTest0.exceptionTest1.test(exceptionTest1.java:18)
at com.exceptionTest0.exceptionTest1.main(exceptionTest1.java:6)
可以看到,throws关键字用在方法声明时表示会抛出何类错误;throw关键字则是直接抛出某种错误。

浙公网安备 33010602011771号