Java语言基础:异常机制(一)

2014-11-24 00:38:55 · 作者: · 浏览: 2

1. 抛出异常

通过throw new ThrowableClass语法可以抛出一个异常,其中ThrowableClass是一个从Throwable继承的类,或者是Throwable类本身,先看下面的
view plaincopy to clipboardprint
public void proc(){
// Exception是Throwable的继承类,代表最基本的异常
throw new Exception("hello");
}
public void proc(){
// Exception是Throwable的继承类,代表最基本的异常
throw new Exception("hello");
}

上面的代码会导致编译错误,对于有抛出异常的方法,编译器强制要求:要么在方法上声明要抛出的异常(称为异常说明),要么在方法中用try块捕获这个异常。
view plaincopy to clipboardprint
// 用异常说明,说明该方法要抛出的异常
public void proc() throws Exception{
throw new Exception("hello");
}

// 用try块捕获该异常
public void proc(){
try {
throw new Exception("hello");
} catch (Exception e) {
e.printStackTrace();
}
}
// 用异常说明,说明该方法要抛出的异常
public void proc() throws Exception{
throw new Exception("hello");
}

// 用try块捕获该异常
public void proc(){
try {
throw new Exception("hello");
} catch (Exception e) {
e.printStackTrace();
}
}

异常说明可以是方法抛出的异常类本身,也可以是异常类的基类,比如throws后面可以是throwable。

上面说到对于有抛出异常的方法,必须带有方法声明,这并不准确,当抛出的异常类是RuntimeException或其继承类时,不需要异常说明:
view plaincopy to clipboardprint
// RuntimeException或其继承类不需要异常声明
public void proc(){
throw new RuntimeException("hello");
}
// RuntimeException或其继承类不需要异常声明
public void proc(){
throw new RuntimeException("hello");
}

一个方法即使内部没有抛出异常,也仍然可以带有异常说明:
view plaincopy to clipboardprint
public void proc2() throws NullPointerException, FileNotFoundException {
}
public void proc2() throws NullPointerException, FileNotFoundException {
}

一个方法若带有异常说明,则调用它的其他方法也要带有异常说明,或者要捕获可能抛出的异常:
view plaincopy to clipboardprint
class A {
public void proc() throws Exception {
throw new Exception("hello");
}
// 异常声明
public void proc1() throws Exception {
proc();
}
// 异常声明,声明中的类可以是基类
public void proc2() throws Throwable {
proc();
}
// 直接捕获异常
public void proc3() {
try {
proc();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class A {
public void proc() throws Exception {
throw new Exception("hello");
}
// 异常声明
public void proc1() throws Exception {
proc();
}
// 异常声明,声明中的类可以是基类
public void proc2() throws Throwable {
proc();
}
// 直接捕获异常
public void proc3() {
try {
proc();
} catch (Exception e) {
e.printStackTrace();
}
}
}

可以基于Exception现实自己的异常类:
view plaincopy to clipboardprint
class MyException1 extends Exception {
}
class MyException2 extends Exception {
}
class A {
public void proc() throws MyException1, MyException2{
}
}
class MyException1 extends Exception {
}
class MyException2 extends Exception {
}
class A {
public void proc() throws MyException1, MyException2{
}
}

2. 捕获异常和结束清理

用try{}块包围住可能引发异常的代码,后面紧跟着异常处理器(即catch(...){}块);catch块可以有多个,()中声明要捕获的异常类。当try块抛出一个异常时,执行代码将跳到catch块去,并从第一个catch块开始匹配,直到找到符合的catch块。请看下面的代码说明:
view plaincopy to clipboardprint
class MyException1 extends Exception {
}
class MyException2 extends Exception {
}
class MyException3 extends Exception {
}
class A {
public void proc() throws Exception{
try{
// 仅仅为了演示用
Random random = new Random();
int i = random.nextInt(3);
if (i =