java学习笔记 --12-- 通过异常处理错误

Java / 2020-03-30

基本异常

抛出异常后,在堆中新建一个异常对象,从当前环境中弹出对象的引用,异常处理程序开始接管程序,寻找一个恰当的地方继续执行程序
恢复到某个稳定点
重点:如果异常发生,程序不会沿着正常的路走下去

异常参数

异常对象两个构造器:一个默认无参构造器,一个参数为字符串的构造器
new一个异常对象后,对象的引用传给throw
Throwable:异常的根类

捕获异常

监控区域:一段可能出现异常的代码,后面跟着处理异常的代码

try块

里面放置所有可能出现异常的代码

异常处理程序

catch:接受一个异常处理

终止与恢复

终止:错误严重,程序不能回来继续执行
恢复:调用新的方法可以处理错误,程序能继续执行

创建异常类

java中只能继承异常类
类名就说明了异常信息

package com.company;

/**
 * @ClassName ExceptionTest
 * @Description
 * @Auther liuxiansen
 * @Date 2020/3/30 8:10 下午
 **/
public class ThemeNotFoundException extends Exception {

    public ThemeNotFoundException(){

    }

    public ThemeNotFoundException(String msg){
        super(msg);
    }
}


异常说明

throws:后面接一个潜在异常类型的链表

捕获所有的异常

Exception:异常类型的基类(编程相关),还有其他的基类,放在最后捕获异常,放置抢了其他的异常
方法:

  • getMessage
  • getLocalizedMessage

重新抛出异常

package com.company;

/**
 * @ClassName Test
 * @Description
 * @Auther liuxiansen
 * @Date 2020/3/29 8:55 上午
 **/
public class Test{

    public static void main(String [] args) throws Exception {
        int a = 0;
        try {

        } catch (Exception e){
            throw e;
        }
    }

}


catch捕获异常后重新抛出,后面的catch就不会捕获了

异常链

异常链:捕获一个异常后想抛出另一个异常
JDK1.4后,可以使用cause对象作为参数,表示原始异常
三个基本异常类提供了cause参数构造器

  • Error
  • Exception
  • RuntimeException
    其他的异常类只能使用initCause方法
package com.company;

/**
 * @ClassName ExceptionTest
 * @Description
 * @Auther liuxiansen
 * @Date 2020/3/30 8:10 下午
 **/
public class ThemeNotFoundException extends Exception {

    public ThemeNotFoundException(){

    }

    public ThemeNotFoundException(String msg){
        super(msg);
    }
    
    public ThemeNotFoundException(String msg,Throwable cause){
        super(msg,cause
        );
    }
}


使用Cause参数

java标准异常

Throwable这个类表示所有可以被作为异常抛出的类
继承Throwable的类可以分为两种类型:

  • Error:编译时和系统错误(一般不需要关心)
  • Exception:被抛出的基本类型,运行时故障

java程序员一般只关心基本类型Exception

异常的基本概念:名称表示发生的问题

RuntimeException:运行时异常,JVM自动捕获抛出,比如NullPointerException

使用finally进行清理

无论try中的代码是否抛出异常,finally中的代码都会执行

package com.company;

/**
 * @ClassName Test
 * @Description
 * @Auther liuxiansen
 * @Date 2020/3/29 8:55 上午
 **/
public class Test{

    public static void main(String [] args) throws Exception {
        int a = 0;
        try {

        } catch (RuntimeException e){
            throw e;
        } catch (Exception e){
            throw e;
        } finally {
            System.out.println("jj");
        }
    }

}


什么时候用finally:把内存之外的资源恢复到初始状态,比如打开的文件或网络连接,或者某个开关

即使涉及到break continue,finally也会执行

未完。。。