Java基础(8)异常

目录

1.前言

2.正文

2.1异常的引入

2.2异常的类型

2.2.1编译时异常

2.2.2运行时异常

2.3区分Exception与Error

2.4异常的声明,抛出与捕获

2.4.1throw

2.4.2throws

2.4.2try-catch与finally

2.6自定义异常

3.小结


1.前言

哈喽大家好啊,Java基础马上就要到尾声了,讲完异常这个章节之后再讲一个String类,Java基础基本就结束了,那么让我们废话不多说开始下面的学习。

2.正文

2.1异常的引入

异常是什么,虽然这个概念听起来很陌生,但在我们平时编写程序的时候肯定会出现异常啦,下面就是据一些例子:

public class test {
    public static void main(String[] args) {
        System.out.println(10 / 0);
    }
}

 接下来就让我们来解释一下这个异常:

它表示在算术运算过程中出现了异常情况。这个异常通常在执行算术运算时抛出。

public class test {
    public static void main(String[] args) {
        int[] array = new int[] {1,2,3,4,5};
        System.out.println(array[10]);
    }
}

这个也是一个常见的异常,大概意思如下:

它表明程序试图访问数组中不存在的索引。换句话说,当你尝试访问数组的某个元素时,如果使用的索引超出了数组的有效索引范围(即小于0或大于等于数组长度),就会抛出这个异常。 

我们见识了这些常见的异常,那么异常到底是什么呢,接下来就是异常的概念:

异常(Exception)是指程序执行过程中可能出现的不正常情况或错误。它是一个事件,会中断正在执行的程序,并可能导致程序出现错误或崩溃。

2.2异常的类型

2.2.1编译时异常

编译性异常(也称为编译时异常或检查型异常)是在编译阶段就能被检测到的异常,它们必须被显式地捕获或声明在方法签名中,至于如何写在方法签名中下文的throws会讲解。另外要注意以下几点:

  • 编译时异常必须在编译时处理,要么通过try-catch语句捕获处理,要么通过方法签名使用throws关键字声明抛出。如果既没有捕获也没有声明抛出,编译器会报错。
  • 受检异常通常表示可恢复的错误,也就是说,程序在遇到这类异常时,可以选择恰当的恢复策略,比如重新尝试操作、提供替代方案等。

2.2.2运行时异常

运行时异常表示在程序运行时可能发生的错误。这些异常通常是程序逻辑错误导致的,编译器不会强制要求开发者捕获这些异常。运行时异常的主要特点如下:

  • 运行时异常在编译时不需要处理,编译器不会强制要求捕获或声明抛出。这意味着,即使代码中存在可能抛出运行时异常的情况,编译器也不会报错。

  • 运行时异常通常表示不可恢复的错误,一旦发生,程序往往无法继续正常执行。因此,运行时异常通常不需要捕获处理,而是通过代码审查和测试来避免。

2.3区分Exception与Error

在区分这个之前,我们需要先讲解一下异常的本质:

异常在Java中的本质是类。Java的异常处理机制是建立在类和对象的基础上的。所有的异常都是从java.lang.Throwable类派生出来的子类。Throwable类有两个重要的子类:ExceptionError

在明白这个之后我们就可以来区分Exception与Error了,Exception表示程序运行时可预料的异常,可以被捕获(即通过try-catch处理)并处理,使程序有机会恢复;而Error表示JVM或系统层面的严重错误,通常不可预料且无法恢复,不建议捕获处理。

2.4异常的声明,抛出与捕获

在我们明白异常的概念之后,那我们在实际的编程中要如何处理这些异常,如何尽可能规避这些异常呢,接下来我们就需要来讲解几个关键字以及具体应用

2.4.1throw

throw的语法规则如下:

throw new Exception("自定义异常信息");

有以下几个需要注意的点:

  • 抛出的异常必须是Throwable类的子类。
  • throw关键字只能在方法内部使用,不能在方法外部或静态代码块中直接抛出异常。

下面是具体的示例: 

public class test {
    // 一个方法,用于检查输入的数字是否为正数
    public void checkPositiveNumber(int number) {
        // 使用throw关键字抛出一个IllegalArgumentException
        if (number <= 0) {
            throw new IllegalArgumentException("数字必须是正数");
        }
        System.out.println("数字是正数: " + number);
    }

    public static void main(String[] args) {
        test example = new test();
        example.checkPositiveNumber(10);
        example.checkPositiveNumber(-1);
    }
}

主函数中分别输入了10和-1,运行结果如下:

2.4.2throws

throws关键字是用于声明下段代码可能会出现异常,并标示出来,实际上并没有起到解决异常根本的作用,为了使程序能够进行下去,接下来是具体的使用规则:

public void someMethod() throws ExceptionA, ExceptionB {
    // 方法体
}

使用时有以下注意的点:

  • 只能声明检查型异常throws只能用于声明检查型异常(其中的大类是编译型异常),不能用于非检查型异常。
  • 可以声明多个异常:一个方法可以声明它可能会抛出多个异常类型。
  • 方法内部不处理的异常:如果一个方法可能会抛出某些异常,但选择不处理它们,那么必须在方法签名中使用throws声明这些异常。
  • 构造函数和静态初始化块throws不能用于构造函数和静态初始化块。

下面就对上文出现的代码中的异常进行了声明: 

public class test {
    // 一个方法,用于检查输入的数字是否为正数
    public void checkPositiveNumber(int number) throw IllegalArgumentException{
        if (number <= 0) {
            throw new IllegalArgumentException("数字必须是正数");
        }
        System.out.println("数字是正数: " + number);
    }

    public static void main(String[] args) {
        test example = new test();
        example.checkPositiveNumber(10);
        example.checkPositiveNumber(-1);
    }
}

2.4.2try-catch与finally

try-catch是Java中用于异常处理的一组关键字,它们允许程序在发生异常时捕获并处理这些异常,而不是让程序崩溃,具体语法规则如下:

try {
    // 可能抛出异常的代码
} catch (ExceptionType name) {
    // 异常处理代码
}

一般在代码进行完后,我们需要对代码运行做一些收尾工作,比如将之前Scanner关闭等,语法规则如下:

try {
    // 可能抛出异常的代码
} catch (ExceptionType name) {
    // 异常处理代码
} finally {
    // 总是执行的代码,常用于清理工作
}

我们拿以下代码做示例:

import java.util.Scanner;

public class test {

    public int add(int a, int b) throws IllegalArgumentException {
        if (a < 0 || b < 0) {
            throw new IllegalArgumentException("数字不能为负数");
        }
        return a + b;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        test calculator = new test();
        try {
            System.out.print("请输入第一个加数:");
            int num1 = scanner.nextInt();
            System.out.print("请输入第二个加数:");
            int num2 = scanner.nextInt();

            int result = calculator.add(num1, num2);
            System.out.println("两数之和为:" + result);
        } catch (IllegalArgumentException e) {
            // 捕获并处理IllegalArgumentException
            System.out.println("错误:" + e.getMessage());
        } finally {
            // 关闭scanner资源
            scanner.close();
            System.out.println("finally已运行.....");
        }
    }
}

这一段代码实现的功能很基础,但运用了我们上文所讲的所有的关键字,接下来详细分析一下该代码的俩种执行结果:

如果俩数皆为正数:

  • 则在运行完try模块后直接运行finally板块。

 


如果俩数中有负数:

  • 在跳转到add方法时抛出IllegalArgumentException异常
  • catch对该异常进行捕捉并打印错误信息(对异常进行实例化然后调用getMessage自带的方法)
  • 再运行finally。

2.6自定义异常

Java中已经为我们提供了许多异常,但我们在实际工程中也可以自己创建一个更加切合应用场景的自定义异常,来更好的为项目服务,提供更加详尽的异常信息。接下来我们以一个登陆系统背景为例来讲清楚,示例如下:

class passWordException extends Exception {
    public passWordException() {
        super();
    }

    public passWordException(String s) {
        super(s);
    }
}

class Login {
    private static String correctPassword = "123456";
    private String password;

    public Login(String password) {
        this.password = password;
    }

    public boolean checkPassword() throws passWordException {
        if (!this.password.equals(correctPassword)) {
            throw new passWordException("密码错误!");
        }
        return true;
    }
}

public class test {
    public static void main(String[] args) {
        try {
            Login login1 = new Login("123456");
            System.out.println("尝试登录1: " + login1.checkPassword());

            Login login2 = new Login("654321");
            System.out.println("尝试登录2: " + login2.checkPassword());
        } catch (passWordException e) {
            System.out.println("捕获到异常: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

上段代码展示了如何自定义一个异常类,在继承Exception类后在自定义异常类中写自己的方法, 最后进行调试。

运行结果如下:

第一次登陆时没有异常,第二次登陆后触发该异常,捕捉到异常后打印异常信息(红字中均是打印出的错误信息)

3.小结

今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,你的支持就是对我最大的鼓励,加油!

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

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

相关文章

功能强大视频编辑软件 Movavi Video Editor Plus 2024 v24.2.0 中文特别版

Movavi Video Editor Plus中文修改版是一款功能强大的视频制作编辑软件&#xff0c;使用能够帮助用户快速从录制的素材中制作成一个精美的电影&#xff0c;支持进行视频剪辑&#xff0c;支持添加背影、音乐和各种音乐&#xff0c;软件使用简单&#xff0c;无需任何的经验和专业…

闯关leetcode——231. Power of Two

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/power-of-two/description/ 内容 Given an integer n, return true if it is a power of two. Otherwise, return false. An integer n is a power of two, if there exists an integer x such th…

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

论文速读:完全测试时域适应(Test-time Adaptation)目标检测(CVPR2024)

原文标题&#xff1a;Fully Test-time Adaptation for Object Detection 中文标题&#xff1a;完全测试时间适应目标检测 通过百度网盘分享的文件&#xff1a;Fully_Test-time_Adaptation_for_Obje... 链接&#xff1a; 百度网盘 请输入提取码 提取码&#xff1a;yrvz 代码地址…

深度学习:卷积神经网络中的im2col

im2col 是一种在卷积神经网络&#xff08;CNN&#xff09;中常用的技术&#xff0c;用于将输入图像数据转换为适合卷积操作的矩阵形式。通过这种转换&#xff0c;卷积操作可以被高效地实现为矩阵乘法&#xff0c;从而加速计算。 在传统的卷积操作中&#xff0c;卷积核&#xff…

深度学习模型入门教程指南

在当前的人工智能生成内容&#xff08;AIGC&#xff09;领域中&#xff0c;深度学习模型无疑是支撑其技术核心的关键组件。深度学习模型的广泛应用极大地推动了图像生成、自然语言处理和自动化工作流的发展&#xff0c;本文将从多个角度介绍深度学习模型的概念、构建过程、实际…

计算机网络:网络层 —— IPv4 数据报的首部格式

文章目录 IPv4数据报的首部格式IPv4数据报分片生存时间 TTL字段协议字段首部检验和字段 IPv4数据报的首部格式 IPv4 数据报的首部格式及其内容是实现 IPv4 协议各种功能的基础。 在 TCP/IP 标准中&#xff0c;各种数据格式常常以32比特(即4字节)为单位来描述 固定部分&#x…

Java_Springboot核心配置详解

Spring Boot以其简洁、高效和约定优于配置的理念&#xff0c;极大地简化了Java应用的开发流程。在Spring Boot中&#xff0c;核心配置是应用启动和运行的基础。本文将详细介绍Spring Boot中的两种配置文件格式、基础注解的配置方式、自定义配置以及多环境配置。 一、Spring Bo…

【GESP】C++一级知识点研究,cout和printf性能差异分析

一道简单循环输出练习题(BCQM3148&#xff0c;循环输出)&#xff0c;由于cout的代码超时问题&#xff0c;让我注意到二者在使用上的差异&#xff0c;遂查阅研究如下。 全文详见&#xff1a;https://www.coderli.com/gesp-knowledge-cout-printf/【GESP】C一级知识点研究&#…

【网络安全】揭示 Web 缓存污染与欺骗漏洞

未经许可,不得转载。 文章目录 前言污染与欺骗Web 缓存污染 DoS1、HTTP 头部超大 (HHO)2、HTTP 元字符 (HMC)3、HTTP 方法覆盖攻击 (HMO)4、未键入端口5、重定向 DoS6、未键入头部7、Host 头部大小写规范化8、路径规范化9、无效头部 CP-DoS10、HTTP 请求拆分Web 缓存污染与有害…

《数字图像处理基础》学习03-图像的采样

在之前的学习中我已经知道了图像的分类&#xff1a;物理图像和虚拟图像。《数字图像处理基础》学习01-数字图像处理的相关基础知识_图像处理 数字-CSDN博客 目录 一&#xff0c;连续图像和离散图像的概念 二&#xff0c;图像的采样 1&#xff0c; 不同采样频率采样同一张图…

微服务实战系列之玩转Docker(十七)

导览 前言Q&#xff1a;如何实现etcd数据的可视化管理一、创建etcd集群1. 节点定义2. 集群成员2.1 docker ps2.2 docker exec2.3 etcdctl member list 二、发布数据1. 添加数据2. 数据共享 三、可视化管理1. ETCD Keeper入门1.1 简介1.2 安装1.2.1 定义compose.yml1.2.2 启动ke…

MobileNetv2网络详解

背景&#xff1a; MobileNet v1中DW卷积在训练完之后部分卷积核会废掉&#xff0c;大部分参数为“0” MobileNet v2网络是由Google团队在2018年提出的&#xff0c;相比于MobileNet v1网络&#xff0c;准确率更高&#xff0c;模型更小 网络亮点&#xff1a; Inverted Residu…

巨好看的登录注册界面源码

展示效果 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevic…

机械臂建模之DH表

本文配图 取自哔哩哔哩机器人学视频 林沛群老师的PPT 机械臂几何直观描述 首先要知道DH表中四个参数的含义&#xff1a; 对于 a 、 α 、 d 、 θ i a、 \alpha 、 d 、 \theta_i a、α、d、θi​ 四个参数&#xff0c;上图采用MDH的方式&#xff0c;对于一个轴的这四个参数&a…

Flink CDC系列之:学习理解核心概念——Data Pipeline

Flink CDC系列之&#xff1a;学习理解核心概念——Data Pipeline 数据管道sourcesink管道配置Table IDroutetransform案例 数据管道 由于 Flink CDC 中的事件以管道方式从上游流向下游&#xff0c;因此整个 ETL 任务被称为数据管道。 管道对应于 Flink 中的一系列操作。 要描…

Git 本地操作(2)

会以下操作就可以完成本地的版本控制了&#xff0c;就不需要再复制文件每次改一个东西就复制整个工程保存下来啦&#xff01; 建议先看上一篇文章噢 &#xff01;&#xff01;&#xff01; 一、新建项目git本地操作 1、初始化仓库 创建一个 project 文件夹&#xff0c;将需…

Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景

介绍 网络爬虫&#xff08;Web Crawler&#xff09;是自动化的数据采集工具&#xff0c;用于从网络上提取所需的数据。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;很多网站增加了复杂的防护机制&#xff0c;使得数据采集变得更加困难。在这种情况下&#xff0c;Pyt…

Linux中NFS配置

文章目录 一、NFS介绍1.1、NFS的工作流程1.2、NFS主要涉及的软件包1.3、NFS的主要配置文件 二、安装NFS2.1、更新yum2.2、安装NFS服务2.3、配置NFS服务器2.4、启动NFS服务2.5、配置防火墙&#xff08;如果启用了防火墙&#xff0c;需要允许NFS相关的端口通过&#xff09;2.6、生…