一、什么是异常?
“意料之外”的事情就是异常。
二、Java异常对象结构
Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。* Java异常继承结构
Throwable
Error
Exception
RuntimeException
| 类名 | 解释 | 是否受检异常 | 是否需要catch异常 | 分类 | 是否可恢复 |
| Error | 合理的应用程序不应该试图捕获的严重问题,由JVM检查处理 | 受检 | 不需要 | 编译器异常 | 不可恢复 |
| Exception | 合理的应用程序想要捕获的条件 | 需要 | 可恢复 | ||
| RunnableExceptioin | 在 Java 虚拟机正常运行期间抛出的异常的超类。(通常是代码错误) | 非受检 | 需要 | 运行时异常 | 可恢复 |
三、Java异常关键字
try、 catch 、throw、throws、finally四、try关键字
try用途:监听可能出现问题的代码块,并可选择对已知问题进行恢复或终止处理。try语句块中代码,仅执行到第一个出现异常的地方,try语句块中后续代码都不再执行。
String str = null;
int[] array = new int[3];
try {
str.length();
int i = array[4];
System.out.println("try语句块内容执行结束");
} catch (NullPointerException e) {
System.out.println("抛出空指针异常");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("抛出数组越界异常");
}输出结果是:抛出空指针异常
try语句块内第一个异常空指针的后续代码都不会执行,即使后续是另外一个异常后者return语句。
五、catch关键字
catch用途:针对try监听到的异常分别进行相应处理。1. catch分支执行顺序(与swtich不同)
/**
* 出现异常时,catch执行的向后顺序
* 1. 流程是由上至下匹配
* 2. 仅匹配一个(找到一个匹配的catch,之后的都不再执行)
* 3. 子类异常也会被父类异常捕获(可以catch Exception,后续都不会执行)
*/
private static void studyCatch() {
String str = null;
try {
str.length();
} catch (NullPointerException e) {
System.out.println("抛出空指针异常");
} catch (RuntimeException e) {
System.out.println("抛出运行时异常");
}
// 以下代码NullPointerException处会提示异常,因为此处根本不可能执行
// try {
// str.length();
// } catch (RuntimeException e) {
// e.printStackTrace();
// } catch (NullPointerException e) {
//
// }
}
2. catch语句块中处理可选方式: 2.1 输出 2.2 转译 2.3 向上抛出
六、throw与throws
1. throw与throws的区别?
| Throw |
Throws |
| 方法体中 |
方法头部 |
| 执行一定会抛出一种异常 |
即使执行,只是表示可能会有异常 |
| 不会由函数去处理异常,真正的处理异常由函数的上层调用处理。 |
|
2. throws 限制
在继承或者覆盖过程中,某个特定的方法“异常说明的接口”不是变大了,而是变小了七、finally
用途:无论是否出现异常都会执行的代码块1. finally与return关键字
/**
* return 在try、catch中finally语句块都会被执行
*
* 结果:
* catch 空指针异常被执行
* finally语句执行
*/
private static void finally_return_try_exception() {
try {
String str = null;
str.length();
return;
} catch (Exception e) {
System.err.println("catch 空指针异常被执行 \n");
return;
} finally {
System.out.println("finally语句执行");
}
}
2. 异常情况,finally代码块不一定能确保肯定会被执行 程序所在线程死亡;
在前面的代码中用了System.exit();
2013-12-01 星期天 发出blog