java复习——异常(Exception)

90 阅读2分钟

异常(Exception)

程序在执行过程中遇到的不正常情况(开发过程中的语法错误不算)

异常体系图

image.png

  1. 编译异常:java源程序——>java字节码文件
  2. 运行异常:java字节码文件——>在内存中加载

五大运行时异常

  1. NumberFormatException(数字格式异常)
  2. ClassCastException(类型转换异常)
  3. ArrayIndex0utOfBoundsException(数组下标越界)
  4. ArithmeticException(运算异常)
  5. NullPointerException(空指针)

异常处理机制

1.try-catch-finally

程序在运行是自动捕获异常并处理

//语法格式
try{
    //有可能异常的代码
}catch(Exception e){
    //异常过后的处理机制
}finally{//可有可无,根据需求选择
    //最终执行
    //不管上面有没有异常,finally都执行
}

细节

  1. 如果异常发生了,try-catch后面的代码将不会执行,直接进入catch块
  2. 如果异常没有发生,则按顺序执行try,不执行catch块
  3. 如果想不管有没有异常都执行,就在catch后面加finally。一般是关闭连接,释放资源
  4. 可以有多个catch捕获不同的异常,要求父类在前,子类在后
  5. 也可以直接使用try-finally,场景:执行一段代码,不管是否发生异常 ,都执行某个业务逻辑

2.throws

运行过程中的异常交给调用者处理,最定级调用者是jvm

class test{
    public static void main(String[] args) /*throws Exception*/{
        //这里如果不用try-catch,也可以在主方法加throws,让JVM抛出异常
        try{
            test.month();
        }catch(Exception e){
            //处理机制
        }finally{
        }
    }
    public static void month() throws Exception{
        //这里是有可能异常的代码
    }
}
  1. throws可以抛出异常列表,也就是可以抛出多个异常
  2. 对于编译时异常,必须处理
  3. 对于运行时异常,程序中如果没有处理,就由调用他的人处理
  4. 子类重新父类的方法时:子类抛出的异常要么和父类一样,要么是父类异常的子类异常
  5. 在throws过程中,如果有try-catch就不用throws了

自定义异常

class test{
    public static void main(String[] args){
       try{
           //可能异常的代码
        }catch(Exception e){
           throws new TestException("自定义异常");
        } 
    }
}
//可以继承两种异常
//1.Exception          编译时异常——使用后,在调用处需要throws
//2.RunTimeException   运行时异常
class TestException extends RunTimeException{//一般继承RunTimeException,运行时异常
    public TestException(String message){
        super(message);
    }
}