首页 > 技术文章 > Day08-Java异常

clearloveblog 2021-03-02 14:41 原文

Java异常

目录

  1. 什么是异常
  2. 异常体系结构
  3. Java异常处理机制
  4. 处理异常
  5. 自定义异常
  6. 总结

1.什么是异常

异常(Exception)指程序运行中出现的不期而至的各种状况,异常发生在程序运行期间,它影响了正常的程序执行流程。

三类异常:

  • 检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。

  • 运行时异常:运行时异常是可能被程序员避免的异常,运行时异常可以在编译时被忽略。

  • 错误(Error):错误不是异常,而是脱离程序员控制的问题。

异常处理框架--异常体系结构

  • Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

image-20210301143401962

Error:

  • Error类对象有Java虚拟机(JVM)生成并抛出,大多数错误与代码编写者所执行的操作无关。
  • Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需要的内存资源时,将出现OutOfMemoryError(内存溢出错误)
  • 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、连接错误(LinkageError)。

Exception:

  • 在Exception分支中有一个重要的子类RuntimeException(运行时异常)
    • ArrayIndexOutOfBoundsException(数组下标越界)
    • NullPointerException(空指针异常)
    • ArithmeticException(算术异常)
    • MissingResourceException(丢失资源)
    • ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序可以选择捕获处理,也可以不处理。

这些异常一般是由程序逻辑错误引起的。

  • Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。

3、异常处理机制

  • 抛出异常
  • 捕获异常
  • 异常处理五个关键字
    • try、catch、finally、throw、throws
    • 捕获多个异常时,范围最大的异常写在最下面的catch里
    • 选中代码,Ctrl+Alt+T自动生成try catch代码段
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        try{//监控区域
            System.out.println(a/b);
        }catch (ArithmeticException e){//catch(想要捕获的异常类型)捕获异常
            System.out.println("程序异常,数据违规");
        }finally {//无论是否有异常,都必须执行,用来处理善后工作,如关闭资源
            System.out.println("finally");
        }
    }
    //假设方法中处理不了这个异常,方法上抛出异常
    public void test(int a,int b) throws ArithmeticException{
        if(b==0){//throw  throws
            throw new ArithmeticException();//主动抛出异常,一般在方法中使用
        }
    }

5、自定义异常

  • 用户自定义异常类,只需要继承Exception类即可。

image-20210301225822379

//自定义的异常类
public class MyException extends Exception{
    //传递数字-》10
    private int detail;
    public MyException(int a) {
        this.detail = a;
    }
    //toString:异常的打印信息
    @Override
    public String toString() {
        return "MyException{" +
                "detail=" + detail +
                '}';
    }
}
public class Test {
    public static void main(String[] args) {
        try {
            test(11);
        } catch (MyException e) {
            System.out.println("MyException:"+e);
        }
    }
    public static void test(int a) throws MyException {
        System.out.println("传递的参数为:"+a);
        if(a>10){
                throw new MyException(a);//抛出
        }
        System.out.println("OK");
    }
}

6、总结

image-20210301231740580

推荐阅读