Java 异常

Java 异常

异常体系结构图

绿色的是编译时受检查的异常,如果在编译前得到处理,那么就不能通过编译;红色的异常则是不受检查的异常,只有在程序运行起来的时候才能被发现和处理;

异常概述

在 Java 语言中,将程序执行过程中发生的不正常的情况称为异常、不包括开发过程中的语法错误和逻辑错误。

  • Error:虚拟机无法解决的问题,例如 JVM 系统内部错误、资源耗尽等严重错误,比如:StackOverflowError 和 OOM(堆溢出 OutOfMemoryError ) 一般情况下不会编写相对应的代码进行处理。

  • Exception:因编码错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理,例如:空指针访问、试图读取不存在的文件、网络连接中断、数组角标越界

  • 异常又分为:编译时异常、运行时异常

    • 编译时异常:IOException、FileNotFoundException、ClassNotFoundException

    • 运行时异常:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、NumberFormatException、InputMismatchException、ArithmaticException(算数异常)

异常处理机制

  • try 监控区域
  • catch 捕获异常 -- 要知道异常的类型
  • finally -- 释放占用资源
  • throws
  • throw

异常处理

方式一

  • 抛:程序在正常执行的过程中,一旦出现异常,就会在代码异常处生成一个对应的异常类对象,并将此对象抛出,抛出后,其后面的代码将不再执行

  • 抓:异常的处理方式

try-catch-finally

各部分职责

try{ } 代码块

  • 包装可能出现问题的代码 出现异常后,会生成对应的异常对象,根据此对象去匹配 catch 中的异常类型;
  • 在没有写 finally 结构的情况下执行完 catch 语句就直接跳出 try-catch 结构,继续执行其后面的代码 ;

catch(异常类型1 变量名1 ){ }

catch 处理方式:处理异常或者打印异常信息;

finally{ }

  • 它是一个一定会执行的代码;即使 try、catch 中有 return 语句 或者 catch 中又出现异常 finally 也会执行;

  • 例如:数据库的连接、输入输出流、网络编程 socket 等资源,JVM 是不能自动回收的,我们需要自己手动进行资源的释放;

  • 资源的释放就要放在 finally 里面

方式二

throws 向上抛出给上层进行处理;

throws + 异常类型 先在方法声明处,指明在方法执行是可能会抛出异常,一旦方法遇到异常就体执行抛出,异常后续的代码将不再执行;

方式三

“主动抛一个异常”

throw new RuntimeException("抛出异常"); 运行时异常我们一般不做处理

throw new Exception("错误信息"); 此时我们就需要对异常进行处理,需要处理或者向上抛出

try {
    if (b >= 0) {
        System.out.println("");
    } else {
        throw new Exception("数字非法!"); //手动抛出异常  手动生成异常
    }
} catch (Exception e) {
    e.printStackTrace();
    System.out.println(e.getMessage());
} finally {
    System.out.println("已经处理");
}

throw 与 throws 的区分

  • throws 是处理异常的一冲方式用于声明在方法头
public void add() throws RuntimeException{
    
}
  • throw 是用于主动抛出异常,手动创建异常对象并抛出
throw new Exception("数字非法!");

自定义异常类

实现自定义类的条件:

  1. 必须继承于现有异常 RuntimeException(不用显式的处理异常)、Exception(需要处理)
  2. 提供一个全局变量用于标识该异常 serialVersionUID
  3. 提供重载的构造器

实现:

public class demo02Exception extends Exception {
    static final long serialVersionUID = -3387517893124229948L;

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

参考链接:https://javaguide.cn/java/basis/java基础知识总结/

posted @ 2022-01-09 15:56  atroot  阅读(40)  评论(0编辑  收藏  举报