Java异常讲解

🐵本篇文章将对异常相关知识进行讲解


一、异常的结构

在程序执行的过程中出现的一些问题叫做异常,异常其实是一个一个类,每一种异常都代表一个类

1.1 几种常见的异常

System.out.println(10/0); //算数异常
//Exception in thread "main" java.lang.ArithmeticException: / by zero

int[] arr = new int[]{1,2,3,4};
System.out.println(arr[10]); //数组越界异常
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10

int[] arr = null;
System.out.println(arr[10]); //空指针异常
//Exception in thread "main" java.lang.NullPointerException

1.2 异常的结构

图中的Exception就是我们说的异常,它继承自Throwable类,同时又派生出IOException和RunTimeException类,它们分别是编译时异常(受查异常)和运行时异常(非受查异常)

二、异常的处理

关于异常的处理有5个关键字:throw,throws,try,catch,finally;下面会逐个讲解

2.1 异常的抛出:throw

int[] arr = new int[]{1,2,3,4};
System.out.println(arr[10]); //数组越界异常

在下面的代码中会抛出一个数组越界异常,如下:

这时编译器自己抛出的,在一些特定的环境下,我们也可以自己主动抛异常,来让程序终止,这时就可以用到throw关键字,用法如下:

throw new ...Exception("数组越界异常");

将上面的代码改成下面的:

int pos = 6;
int[] arr = new int[]{1,2,3,4};
if (pos > arr.length) {
    throw new ArithmeticException("数组越界异常");
}
System.out.println("after");

运行结果如下:

可以看到最后一句打印after并没有执行

throw相关注意事项:

1.throw必须写到方法内部

2.throw只能抛出Exception的对象或Exception子类的对象

3.异常一经抛出,其后的代码将不再执行

2.2 异常的声明:throws

throws在方法的参数列表之后,用法如下:

public static void func() throws ArithmeticException {
    System.out.println(10/0);
}

其作用是告诉该方法的调用者此方法可能有这个异常,调用者必须处理该异常或继续将该异常告诉它的调用者,如果没有进行上述操作,则:1. 若抛出的编译时异常,则编译报错,2. 若抛出的是运行时异常,则该异常会交给JVM处理,程序会直接终止


public static void func1() throws Exception{
        
}
public static void main(String[] args) throws Exception{
    func1();
}

上述代码中func1方法声明一个Exception,Exception类派生出IOException和RuntimeException两个类,main方法会将这里当成一个编译时异常处理,那么要想不编译报错,应该在main方法也声明Exception

throws相关注意事项:

1. throws关键字必须在方法的参数列表之后

2. 只能声明Exception或Exception的子类

3. 如果要声明多个异常,则让异常之间用逗号隔开即可,若多个异常具有父子关系,则只声明父类异常即可

2.3 异常的捕获:try-catch

try-catch通常用来处理异常用的,使用方法如下图:

下面举个实例:

    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        try {
            System.out.println(arr[100]);

            System.out.println("after"); //由于上面那行代码抛出了异常,所以这行代码不会执行

        } catch (ArrayIndexOutOfBoundsException e) { //异常被这个catch捕获
            System.out.println("这是个数组下标越界异常");
            e.printStackTrace(); //打印红字

        } catch (NullPointerException e) {
            System.out.println("这是个空指针异常");
            e.printStackTrace();
        }
        System.out.println("after try catch");
    }

打印结果:

2.4 finally

finally一般放在try-catch结构的最后,

finally中的代码一定会被执行,所以通常在其中进行一些资源清理的扫尾工作

    public static int getData() {
        Scanner scanner = new Scanner(System.in);

        try {
            int data = scanner.nextInt();
            return data; //data被返回后,finally中的代码仍然会执行
        } catch (InputMismatchException e) {
            e.printStackTrace();
            System.out.println("输入异常错误");
        } finally {
            System.out.println("执行finally中的代码");
            scanner.close();
        }
        System.out.println("try-catch-finally之后的代码"); //这里的代码不会被执行
        return 0;
    }

三、自定义异常

前面说过异常是一个类,自定义一个异常类必须继承Exception或RuntimeException,继承自Exception的异常默认为编译时异常,继承自RuntimeException的异常默认为运行时异常 

//自定义用户名错误异常
public class UserNameException extends RuntimeException{
    public UserNameException() {
        super();
    }
    public UserNameException(String s) {
        super(s);
    }
}

//自定义密码错误异常
public class PassWordException extends RuntimeException {
    public PassWordException() {
        super();
    }
    public PassWordException(String s) {
        super(s);
    }
}

   
class Test {
    private String admin = "admin";
    private String passWord = "123456";

    public void login(String admin, String passWord) {
        if (!this.admin.equals(admin)) {
            throw new UserNameException("用户名错误!");
        } else if (!this.passWord.equals(passWord)) {
            throw new PassWordException("密码错误!");
        }
    }
    public static void main(String[] args) {
        //int a = getData();
        Test test = new Test();
        test.login("admin1", "123456");
    }
}

下面是空指针异常的源码,我们上面自定义异常的内容是仿照此来写的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/223540.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学习 JavaScript APl(七):实例解析关于京东案例头部案例和放大镜效果!

大家好关于JS APl 知识点已经全部总结了,第七部部分全部都是案例部分呢!!(素材的可以去百度网盘去下载!!!) 目录 前言 一、个人实战文档 放大镜效果 思路分析: 关于其它…

西工大计算机学院计算机系统基础实验一(函数编写11~14)

稳住心态不要慌,如果考试周冲突的话,可以直接复制这篇博客和上一篇博客西工大计算机学院计算机系统基础实验一(函数编写1~10)-CSDN博客最后的代码,然后直接提交,等熬过考试周之后回过头再慢慢做也可以。 第…

androidstudio设置内存

androidstudio一直 scanning files to index,需要去设置内存: 操作如下:

基于单片机自动饮料混合机控制系统设计

**单片机设计介绍,基于单片机自动饮料混合机控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机自动饮料混合机控制系统设计是一个涉及多个领域的复杂项目,包括单片机技术、传感器技术…

C语言--每日练习题--Day38

第一题 1. 下列代码的运行结果() short i 65537; int j i 1; printf("i%d,j%d\n", i, j); A:i 65537,j 65538 B:i 1,j 2 C:i -1,j 0 D:i 1&#xff…

免费好用的5个AI写作工具,如何更好的使用AI写作工具

人工智能(AI)作为当今科技领域的热门话题,正在以惊人的速度改变我们生活的方方面面。从智能助手到自动驾驶汽车,AI的应用已经渗透到我们日常的方方面面。 1. 什么是AI人工智能? 什么是AI人工智能?简而言之…

【源码解析】聊聊阻塞队列之BlockingArrayQueue

阻塞队列 阻塞队列:顾名思义 首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下入所示。 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞。当阻塞队列时满的时,往队列里添加元素的操作将会被阻塞。 试图从空的…

湖南麒麟下默认使用串口输出系统日志

有时候为了调试方便,需要将系统日志通过CPU的串口进行输出,以下是针对至强E5V4处理器上安装湖南麒麟操作系统后将日志通过串口输出的配置。 首先在bios中打开串口重定向功能,这里的BIOS是AMI的BIOS 内部配置如下,波特率115200配置…

Python实现FA萤火虫优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

校园教务管理系统

学年论文(课程设计) 题目: 信息管理系统 校园教务管理系统 摘要:数据库技术是现代信息科学与技术的重要组成部分,是计算机数据处理与信息管理系统的核心,随着计算机技术的发展,数据库技…

Android的前台服务

概述 前台服务是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。前台服务必须为状态栏提供通知,将其放在运行中的标题下方。这意味着除非将服务停止或从前台移除,否则不能清除该通知。 在 Android 8.0&…

【使用高德开放平台API和js的Ajax代码实现定位并获得城市的天气情况】

使用高德开放平台API和js的Ajax代码实现定位并获得城市的天气情况 1、注册高德开放平台账号,免费获得Web服务API应用key 高德开放平台Web服务API 按照API点击申请KEY 登录后进入应用管理 新建应用(随意起名) 然后添加key提交即可 然后就可…

MySQL生僻字修改编码utf8mb4

1、查看你编码 SHOW VARIABLES WHERE Variable_name LIKE character_set_% OR Variable_name LIKE collation%;(如果不是下图则继续) 2、修改默认参数 /etc/my.cnf [mysqld] datadir/usr/local/mysql/data basedir/usr/local/mysql socket/usr/local/my…

zookeeper集群 +kafka集群

1.zookeeper kafka3.0之前依赖于zookeeper zookeeper是一个开源,分布式的架构,提供协调服务(Apache项目) 基于观察者模式涉及的分布式服务管理架构 存储和管理数据,分布式节点上的服务接受观察者的注册&#xff0c…

【Linux】冯诺依曼体系结构(硬件)、操作系统(软件)、系统调用和库函数 --- 概念篇

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和Linux还有算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 …

Vcenter 6.7 VCSA证书过期问题处理

1. 故障现象 2022年10月25日,登陆VC报错。 按照报错信息,结合官方文档,判断为STS证书过期导致。 vCenter Server Appliance (VCSA) 6.5.x, 6.7.x or vCenter Server 7.0.x 在/var/log/vmware/vpxd-svcs/vpxd-svcs.log看到类似报错: ERRO…

深度探索 Python Pyramid 框架

更多资料获取 📚 个人网站:ipengtao.com Pyramid是一个灵活且强大的Python web框架,广泛用于构建各种规模的Web应用程序。本文将深度探索Pyramid框架,介绍其核心概念、应用场景以及一些高级特性。 安装与基础用法 首先&#xf…

Python if else条件语句详解

if 分支使用布尔表达式或布尔值作为分支条件来进行分支控制。Python 的 if 分支既可作为语句使用,也可作为表达式使用。下面先介绍 if 分支作为语句使用的情形。 if 语句可使用任意表达式作为分支条件来进行分支控制。Python 的 if 语句有如下三种形式:…

通过仿真理解信道化接收机分析过程

概要 信道化从子信道带宽划分上可分为临界抽取和非临界抽取两种,从各子信道中心频率布局上可分为偶型排列和奇型排列,从处理流程上可分为信道化分析与信道化综合过程。本文主要通过仿真来理解偶型排列/临界抽取/信道化分析过程。 基本原理 常规的数字…

maven生命周期回顾

目录 文章目录 **目录**两种最常用打包方法:生命周期: 两种最常用打包方法: 1.先 clean,然后 package2.先 clean,然后install 生命周期: 根据maven生命周期,当你执行mvn install时&#xff0c…