异常基础

1.异常的种类

异常按照错误的严重性,分为Errow和Exception。如下图所示:

1.Error:程序在运行过程中所遇到的硬件或操作系统的错误,常见的错误有内存溢出,class文件无主函数,JVM虚拟机自身非正常运行。Error是系统内部错误,由JVM抛出,交给系统来处理,程序本身不解决。

2.Exception:异常时是程序运行过程中,可以预料的意外情况。有输入输出异常,空指针,数组下标越界,数据库连接中断,非法参数异常,缺少资源异常,算数异常,类未找到异常,文件未找到异常,未知类型异常。
在这里插入图片描述

2.异常的分类

EXCEPTION(异常)按照性质,又分为编译异常(可检测)和运行时异常(不可检测)。

1.编译时异常:通常是由语法错误和环境因素(外部资源)造成的异常。比如输入输出异常IOException,数据库操作SQLException。Java语言强制要求捕获和处理所有非运行时异常。

2.运行时异常:这些异常一般是由程序逻辑错误引起的,即语义错误。比如算术异常,空指针异常NullPointerException,下标越界IndexOutOfBoundsException。

3.异常的处理

try/catch/finally。try不可以单独存在,要么搭配catch,要么搭配finally,或者三者并存。

1.try代码块:监视代码块的执行,发现对应的的异常则跳转至catch,若无catch则直接到finally块。

2.catch代码块:发生对应的异常会执行里面的代码,要么处理,要么向上抛出。

3.finally代码块:不管是否有异常,都必执行,一般用来清理资源,释放连接等。然而有以下几种情况不会执行到这里的代码。

(1)代码执行流程未进入try代码块。

(2)代码在try代码块中发生死循环,死锁等状态

(3)在try代码块中执行了System.exit()操作

4.异常的处理方式

异常的处理方式
1.不处理
遇到异常问题不进行具体处理,而是继续抛给调用者 (throw,throws)
抛出异常有三种形式:
(1)throw
(2)throws
(3)系统自动抛异常

public class MyException extends Exception{         //创建自定义异常类继承异常类

    public MyException(String message){
        super(message);
    }

}

throw new MyException("性别错误");      //监视代码块是否有异常,有异常跳转至catch

throws和throw区别 :throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。

2.处理

public class Test {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入性别");

        String sex = sc.next();

        if(!(sex.equals("男") || sex.equals("女"))){
            System.out.println("111");
            try {
                throw new MyException("性别错误");      //监视代码块是否有异常,有异常跳转至catch
            } catch (MyException e) {
                e.printStackTrace();
                System.out.println("设置默认性别为男");
                sex = "男";
            }
        }
        System.out.println("性别为"+sex);
    }
}

5.注意

1.当需要向上抛出异常的时候,需根据当前业务场景定义具有业务含义的异常,优先使用行业内定义的异常或者团队内部定义好的。

2.请勿在finally代码块中使用return语句,避免返回值的判断变得复杂。

3.捕获异常具体的子类,而不是Exception,更不是throwable。这样会捕获所有的错误,包括JVM抛出的无法处理的严重错误

4.切记更别忽视任何一个异常(catch住了不做任何处理),即使现在能确保不影响逻辑的正常运行,但是对于将来谁都无法保证代码会如何改动,别给自己挖坑。

5.不要使用异常当作控制流程来使用,这是一个很奇葩也很影响性能的做法。、

6.清理资源,释放连接等操作一定要放在finally代码块中,防止内存泄漏,如果finally块处理的逻辑比较多且模块化,我们可以封装成工具方法调用,代码会比较简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值