欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础之异常

程序员文章站 2022-05-23 11:10:35
...

在程序运行的过程中,可能会因为外部不可预料的因素而导致某个方法的执行失败,称之为异常,而Java有自己的异常机制

异常处理机制


try{
老王.开车();
}catch(撞车 e){
e.get车主().赔钱();
医生.抢救(老王);
}
老王.吃饭();

我们将可能会出现意外情况的语句用try-catch语句包围起来,如果没有出现意外,程序正常执行,如果出现意外,程序进入catch中的处理语句中,处理完后继续往下执行。

class T{
    static void t(){
        int a = 2/0;    print(0); 
    }
    public static void main(String s[]){
        try{ 
            t(); 
        }catch(Exception e){ 
            print(1);   
        }
        print(2); 

运行结果:1 2
Java基础之异常

运行时异常—-编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止;

受检查时异常—-要么用try。。。catch来捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不通过。

Throwable 具有两个子类
A. Exception:处理用户程序应当捕获的异常情况,即表示程序可以处理的

B. Error:Error 类的异常为内部错误,一般是与JVM相关的问题,如:JVM异常,内存不足,系统崩溃等,在正常情况下不期望用户的程序捕获它们

Java基础之异常

多重catch块

一段代码可能会生成多个异常
当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个类型与异常类型匹配的语句
执行其中的一条 catch 语句之后,其他的 catch 语句将被忽略

try{
  …….
} catch(ArrayIndexOutOfBoundsException e) {
  ……
} catch(Exception e) {
  ……
}

【注意】使用多重 catch 语句时,异常子类一定要位于异常父类之前
如:

try{
  …...
} catch(Exception e) {
  ……
} catch(ArrayIndexOutOfBoundsException e) {
  ……
}//错误写法

用户自定义异常

Java API提供的内置异常不一定总能准确描述程序的错误类型,有时还需要用户自已定义异常类
自定义异常需要继承Exception或其子类
class T extends Exception{

}
如:

public class InvalidPhoneException extends Exception{
    private String phone;
    public InvalidPhoneException (String phone){
        this.phone = phone;
    }
    public String getMessage(){
        return “无效的电话号码[”+phone+”]”;
    }
    public String getPhone(){
        return phone;
    }
}
class TestException{
    static void checkPhone(String phone) throws InvalidPhoneException {     
        if(phone==null || phone.trim().length()<7){
        //假设长度小于7就是非法的电话号码
            throw new InvalidPhoneException (phone);
        }
    }
}
//throw是具体向外抛出异常的动作,所以它是抛出一个异常实例即异常对象,throws声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常,所以它后面跟的是异常类型

使用throw和throws
throws
用于定义方法可能会抛出的异常,后面跟异常的类名。当一个方法可能会抛出多个异常时,异常类间用逗号进行分隔
Eg: void t() throws ExceptionA, ExceptionB{}
注意:仅是定义可能抛出,而不是一定会抛出异常。

throw
用于抛出异常对象,后面跟创建的异常对象
Eg:throw new Exception();

finally

如果存在这样的代码:
无论try代码块中的语句是否会产生异常,这段代码都希望被执行,即使写了return也会执行,我们可以把这样的代码放到finally代码块中。

Java基础之异常

class T{
    void t(){
        try{
            int a = 1/0;
        }catch(Exception e){
        }finally{
            //不管try中的语句是否会产生异常,这里的代码总是会执行,即使try中使用了return
        }
}