【Java】Exception 异常处理

在Java程序中,发生的不正常情况称为异常

-【逻辑错误和语法错误】不是异常!

- 分为 Error错误 和 Exception异常

- Error 是JVM无法解决的错误问题 例如内存溢出 StackOverFlow 和 OOM

- Exception一般处理意料之外的问题

例如 空指针 NullPointerException,数组越界 OutofIndexException,连接超时异常,读取不到异常

对于异常的处理,1终止程序运行,2在编写时,就设置存在异常的可能

编译时异常和运行时异常

编译时异常 Checked

运行时异常 UnChecked

两种处理机制  Try - Catch - Finally  Throws - Throw

 - 把编译期可能存在的异常交给运行期处理

// 程序执行过程种出现异常,在异常代码出生成对应异常类的异常对象并抛出
    // 一旦异常对象抛出,程序运行终止
    @Test
    public void exceptionTest1(){
        try{
            // 可能出现的异常的代码
        }catch (Exception exception){ // 出现的异常匹配参数种的异常,进入catch代码块处理异常
            // 处理异常的方式
            exception.printStackTrace();
        }finally {
            // 无论是否发生异常,最终必须执行的代码块
            // 适用在最后必须执行的代码,比如释放资源
            System.out.println("必须执行的代码!");
        }
        // finally 除了在try中直接系统退出之外,一定会执行
        // 如果try中出现了 return 结束方法,也要等finally执行完毕,再回到try执行return
    }

    @Test
    public void exceptionTest2(){
        try{
        }finally { // 可以不处理异常直接执行finally,但是不要这么用
        }
    }

    @Test
    public void exceptionTest3(){
        try{
            // 可以分多个catch 逐一捕获异常
        }catch (NullPointerException nullPointerException){ 
            nullPointerException.printStackTrace();
        }catch (ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException){
            arrayIndexOutOfBoundsException.printStackTrace();
        }catch (ArithmeticException arithmeticException){ 
            arithmeticException.printStackTrace();
        }catch (Exception exception){
            // 当所有异常都没有捕获到时,最后交给总异常处理
            exception.printStackTrace();
        }
        // 不要一开始最头上就写总异常捕获,总异常直接捕获处理后,下面的详细异常捕获不到,写了白写
    }
TRY - CATCH - FINALLY

- 向上继续抛出

    // 如果我们不用try - catch - finally 进行处理,可以直接抛出异常
    
    // throws + 对应的异常类型 ,声明这个方法可能发生的异常,如果发生异常,把异常向上抛出
    // 本质上说,throws 并没有解决异常,只是把异常丢给放法的调用者解决,调用者可以自行try - catch 也可以继续向上抛出
    // 方法出现异常时,在异常代码处生成异常对象,如果此异常符合throws所包含的异常类型时,异常对象抛出
    public void throwsMethod() throws Exception{
       
    }
THROWS

使用场景:

- 父类中被重写的方法没有throws抛出异常,子类也不能使用throws,如果子类重写的方法发生异常必须try-catch处理

- 方法a中调用了其他多个方法,是一种递进关系,被调用的方法应该声明throws抛出,统一在方法a中try-catch处理

- THROW 手动创建异常并抛出异常

    void throwException(int age) throws Exception {
        if (0 < age || age > 100) throw new Exception("不合理的年龄");
    }
THROW

自定义异常类

/*
编译时异常 Exception
运行期异常 RuntimeException
 */

// 自定义异常需要继承异常类
public class WTF_Exception extends Exception{

    // 未知的常量ID
    static final long serialVersionUID = -3387516993124229948L;
    
    public WTF_Exception(){
        
    }
    
    public WTF_Exception(String message){
        super(message);
    }
}
View Code

序列化UID 保存记录标识值?

https://blog.csdn.net/seabreezesuper/article/details/70141844

猜你喜欢

转载自www.cnblogs.com/mindzone/p/12725913.html