当前位置:编程学习 > JAVA >>

Java语言基础:异常机制

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 == 0)  
                throw new MyException1();  
            else if (i == 1)  
                throw new MyException2();  
            else if (i == 2)  
                throw new MyException3();  
        }  
        catch(MyException1 e){  
            // 当抛出MyException1时会跳到这里来。  
            e.printStackTrace();  
        }  
        catch(MyException2 e){  
            // 当

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,