当前位置: 首页 > news >正文

Kotlin 2.1.0 入门教程(十三)异常、Nothing

创建自定义异常

可以通过创建继承内置 Exception 类来定义自定义异常。这允许你创建更符合应用程序需求的特定错误类型。

要创建一个自定义异常,可以定义一个继承 Exception 的类:

class MyException : Exception("My message")

在这个例子中,有一个默认的错误信息 My message,如果你愿意,也可以留空。

Kotlin 中的异常是有状态的对象,携带了与创建它们的上下文相关的信息,称为堆栈跟踪。避免使用对象声明来创建异常。相反,每次需要异常时,创建一个新的异常实例。这样可以确保异常的状态准确反映特定的上下文。

自定义异常也可以是任何已存在的异常子类的子类,例如 ArithmeticException 子类:

class NumberTooLargeException : ArithmeticException("My message")

如果你想创建自定义异常的子类,必须将父类声明为 open,因为默认情况下类是 final 的,否则无法被子类化。

open class MyCustomException(message: String) : Exception(message)class SpecificCustomException : MyCustomException("Specific error message")

自定义异常的行为与内置异常完全相同。你可以使用 throw 关键字抛出它们,并使用 try-catch-finally 块来处理它们。

在具有多种错误场景的应用程序中,创建异常层次结构可以使代码更清晰和更具针对性。你可以通过使用抽象类或密封类作为通用异常特性的基类,并为详细的异常类型创建特定子类来实现这一点。此外,带有可选参数的自定义异常提供了灵活性,允许使用不同的消息进行初始化,从而实现更细粒度的错误处理。

让我们看一个使用密封类 AccountException 作为异常层次结构基类的示例,以及子类 APIKeyExpiredException,它展示了如何使用可选参数来增强异常的详细信息:

// 创建一个抽象类作为与账户相关错误的异常层次结构的基类。
sealed class AccountException(message: String, cause: Throwable? = null) :
Exception(message, cause)// 创建一个 AccountException 的子类。
class InvalidAccountCredentialsException : AccountException("Invalid account credentials detected")// 创建一个 AccountException 的子类,允许添加自定义消息和原因。
class APIKeyExpiredException(message: String = "API key expired", cause: Throwable? = null) : AccountException(message, cause)

Nothing 类型

每个表达式都有一个类型。表达式 throw IllegalArgumentException() 的类型是 Nothing,这是一个内置类型,是所有其他类型的子类型,也被称为底部类型。这意味着 Nothing 可以用作返回类型或泛型类型,在期望任何其他类型的地方使用,而不会导致类型错误。

Nothing 是一种特殊类型,用于表示永远不会成功完成的函数或表达式,可能是因为它们总是抛出异常,或者进入了无限循环等无法结束的执行路径。你可以使用 Nothing 来标记尚未实现的函数或设计为总是抛出异常的函数,从而向编译器和代码阅读者清晰地表明你的意图。如果编译器在函数签名中推断出 Nothing 类型,它会发出警告。显式地将 Nothing 定义为返回类型可以消除此警告。

以下代码展示了 Nothing 类型的使用,其中编译器会将函数调用后的代码标记为不可达:

class Person(val name: String?)fun fail(message: String): Nothing {throw IllegalArgumentException(message)
}fun main() {val person = Person(name = null)val s: String = person.name ?: fail("Name required")
}

TODO() 函数同样使用了 Nothing 类型,它作为一个占位符,用于标记代码中需要未来实现的部分。

fun notImplementedFunction(): Int {TODO("This function is not yet implemented")
}fun main() {// 抛出 NotImplementedError 异常。val result = notImplementedFunction()println(result)
}

TODO() 函数总是抛出 NotImplementedError 异常。

异常类

让我们探讨一些常见的异常类型,它们都是 RuntimeException 类的子类:

ArithmeticException:当无法执行算术操作时(如除以零),会抛出此异常。

// 抛出 ArithmeticException 异常。
val example = 2 / 0

IndexOutOfBoundsException:当访问的索引超出范围时(如数组或字符串的索引),会抛出此异常。

val myList = mutableListOf(1, 2, 3)// 抛出 IndexOutOfBoundsException 异常。
myList.removeAt(3)

为了避免此异常,可以使用更安全的替代方法,如 getOrNull() 函数:

val myList = listOf(1, 2, 3)// 返回 null,而不是抛出 IndexOutOfBoundsException 异常。
val element = myList.getOrNull(3)println("Element at index 3: $element")

NoSuchElementException:当访问集合中不存在的元素时(如使用 first()last()elementAt() 方法),会抛出此异常。

val emptyList = listOf<Int>()// 抛出 NoSuchElementException 异常。
val firstElement = emptyList.first()

为了避免此异常,可以使用更安全的替代方法,如 firstOrNull() 函数:

val emptyList = listOf<Int>()// 返回 null,而不是抛出 NoSuchElementException 异常。
val firstElement = emptyList.firstOrNull()println("First element in empty list: $firstElement")

NumberFormatException:当尝试将字符串转换为数字类型,但字符串格式不正确时,会抛出此异常。

val string = "This is not a number"// 抛出 NumberFormatException 异常。
val number = string.toInt()

为了避免此异常,可以使用更安全的替代方法,如 toIntOrNull() 函数:

val nonNumericString = "not a number"// 返回 null,而不是抛出 NumberFormatException 异常。
val number = nonNumericString.toIntOrNull()println("Converted number: $number")

NullPointerException:当应用程序尝试使用值为 null 的对象引用时,会抛出此异常。尽管空安全特性显著减少了 NullPointerException 的风险,但在使用 !! 操作符或与缺乏空安全特性的 Java 代码交互时,仍然可能发生此异常。

val text: String? = null// 抛出 NullPointerException 异常。
println(text!!.length)

Kotlin 中,所有异常都是未检查的(unchecked),你不需要显式捕获它们。但你仍然可以根据需要灵活地捕获这些异常。

异常层次结构

异常层次结构的根是 Throwable 类。它有两个直接子类:ErrorException

  • Error 子类:表示应用程序可能无法自行恢复的严重基础性问题,这些问题通常不需要尝试处理。例如:OutOfMemoryError(内存不足错误)、StackOverflowError(栈溢出错误)。

  • Exception 子类:用于表示可能需要在代码中处理的异常情况。例如:RuntimeException(运行时异常)、IOException(输入输出异常)。

异常与 JavaSwiftObjective-C 的互操作性

由于 Kotlin 将所有异常视为未检查异常,当从区分检查异常和未检查异常的语言(如 JavaSwiftObjective-C)调用 Kotlin 代码时,可能会导致一些问题。为了解决 Kotlin 与这些语言在异常处理上的差异,可以使用 @Throws 注解。该注解用于提醒调用者可能抛出的异常。

@Throws 注解用于标记 Kotlin 函数可能抛出的异常,以便在 JavaSwiftObjective-C 中调用时能够正确处理。

import kotlin.jvm.Throws@Throws(IOException::class)
fun readFile(filePath: String): String {val file = File(filePath)if (!file.exists()) {throw IOException("File not found: $filePath")}return file.readText()
}

Java 中调用此函数时,编译器会强制处理 IOException

public class Main {public static void main(String[] args) {try {String content = KotlinFileReader.readFile("nonexistent.txt");System.out.println(content);} catch (IOException e) {System.err.println(e.getMessage());}}
}

相关文章:

Kotlin 2.1.0 入门教程(十三)异常、Nothing

创建自定义异常 可以通过创建继承内置 Exception 类来定义自定义异常。这允许你创建更符合应用程序需求的特定错误类型。 要创建一个自定义异常&#xff0c;可以定义一个继承 Exception 的类&#xff1a; class MyException : Exception("My message")在这个例子中…...

Unity 打造游戏资源加密解密系统详解

在游戏开发中&#xff0c;保护游戏资源不被轻易破解和盗用至关重要。本文将详细介绍如何在 Unity 中打造一个游戏资源加密解密系统&#xff0c;并提供技术详解和代码实现。 一、加密方案选择 1.1 对称加密 优点: 加密解密速度快&#xff0c;适合加密大量数据。 缺点: 密钥管…...

HarmonyOS Next 方舟字节码文件格式介绍

在开发中&#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中&#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢&#xff1f;我们以一个demo编译出的abc文件&#xff1a; 二进制就是长这样&#xff0c;怎么去理解呢&…...

二层、三层小总结

一、网络隔离 1、物理隔离。搭建两套完全独立的网络&#xff0c;这也是最土豪最安全的做法。 2、二层隔离。使用Vlan隔离&#xff0c;使用不同Vlan或者Pvlan等。 3、三层隔离。路由隔离。 4、设备特性隔离。比如端口隔离swichport protected&#xff0c;或者ACL等。 5、安全…...

Window系统通过Docker本地安装ollama和deepseek

在 Windows 系统上安装 Ollama 和 DeepSeek 的步骤如下&#xff1a; 安装 Ollama 安装 WSL&#xff08;Windows Subsystem for Linux&#xff09;&#xff1a; 如果还没有安装 过WSL的&#xff08;安装过的你直接跳过就行了&#xff09;&#xff0c;可以按照以下步骤进行安装&…...

云原生后端|实践?

云原生&#xff08;Cloud Native&#xff09;是一种构建和运行应用程序的方法&#xff0c;它充分利用云计算的优势&#xff0c;包括弹性、可扩展性、高可用性和自动化运维。云原生后端开发通常涉及微服务架构、容器化、持续集成/持续部署&#xff08;CI/CD&#xff09;、服务网…...

1.1 Spring生态全景解读

1.1 Spring生态全景解读 1.1.1 Spring Framework发展历程与技术演进&#xff08;深度解析版&#xff09; 技术演进路线图与里程碑事件&#xff1a; 2003.10 - Spring 1.0 发布→ 核心特性&#xff1a;XML Bean配置、AOP基础支持→ 企业痛点&#xff1a;解决EJB复杂性问题&am…...

跨境商家系统搭建||反向海淘系统的搭建

反向海淘系统的搭建主要涉及以下几个方面的工作&#xff1a; 一、需求分析 在搭建反向海淘系统之前&#xff0c;首先需要进行需求分析。这包括明确系统的目标用户群体&#xff0c;了解他们的购物习惯、需求和期望。同时&#xff0c;还需要分析市场上的竞争对手&#xff0c;了…...

LeetCode数学相关算法题(1)【C语言版】

2520. 统计能整除数字的位数 给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 示例 1&#xff1a; 输入&#xff1a;num 7 输出&#xff1a;1 解释&#xff1a;7 被自己整除&…...

云消息队列 ApsaraMQ Serverless 演进:高弹性低成本、更稳定更安全、智能化免运维

如今&#xff0c;消息队列已成为分布式架构中不可或缺的关键服务&#xff0c;为电商、物联网、游戏和教育等行业&#xff0c;提供了异步解耦、集成、高性能和高可靠的核心价值。 过去一年&#xff0c;我们发布了云消息队列 ApsaraMQ 全系列产品 Serverless 化&#xff0c;面向…...

github - 使用

注册账户以及创建仓库 要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/。 之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之后会出现一些仓库的配置信息,这也是一个git的简单教程。 Git…...

cmos晶体管

CMOS晶体管 一、PMOS和NMOS介绍 PN结&#xff1a; P-type和N-type组合在一起&#xff0c;变成一个PN结&#xff08;二极管&#xff09;。在P端给高电压&#xff0c;N端给低电压时&#xff0c;可以导通。否则不导通。 NMOS&#xff1a;有四个端口&#xff1a;gate、source、…...

pip3命令全解析:Python3包管理工具的详细使用指南

pip3命令全解析:Python3包管理工具的详细使用指南 一、基本使用二、升级和更新三、其他常用命令四、换源操作五、注意事项六、帮助信息pip3命令使用说明 pip3 是 Python 3 的包管理工具,用于安装、升级和卸载 Python 3 的包。以下是 pip3 的常用命令及详细说明: 一、基本使…...

统计 product 表中 detail 字段包含 xxx 的产品数量

您可以使用以下 SQL 查询语句来统计 product 表中 detail 字段包含 oss.kxlist.com 的产品数量&#xff1a; SELECT COUNT(*) FROM product WHERE INSTR(detail, oss.kxlist.com) > 0;mysql> SELECT COUNT(*)-> FROM product-> WHERE INSTR(detail, oss.kxlist.co…...

Kafka 集群原来是使用ZK管理,现在新版本是怎么管理的?

目录 基于 ZooKeeper 的管理模式 基于 KRaft 的管理模式 迁移到 KRaft 模式的优势 迁移步骤 Kafka 早期依赖 ZooKeeper(ZK)进行元数据管理、集群协调等工作,但在新版本(Kafka 2.8.0 及之后)引入了 KRaft 模式来替代 ZooKeeper 进行管理。下面详细介绍这两种管理模式以…...

【Java并发编程之什么是指令重排序?如何避免指令重排序?】

Java并发编程之什么是指令重排序? 1.1 指令重排序的原因1.2 指令重排序的示例1.3 指令重排序的影响1.4 如何避免指令重排序带来的问题?1.5 使用原子类1.6 使用 final 关键字1.7 内存屏障(Memory Barrier)1.8 总结在Java中,指令重排序是指编译器和处理器为了提高程序执行效…...

渲影医析Lab学术版

渲影医析 Lab 是武汉渲影软件研发的框架式、模块化、流程化的影像组学分析设计软件&#xff0c;尤其适合处理多模态脑影像数据。通过将影像分析流程细分为可视化节点&#xff0c;并以节点连接的方式构建数据流程&#xff0c;赋予了临床医学研究者、生物医药科研工作者自主设计多…...

利用Minio实现大文件分片上传、断点续传、秒传

利用Minio实现大文件分片上传、断点续传、秒传 demo来自B站蜗牛哥&#xff0c;gitee仓库&#xff1a;minio-upload: 使用vue3 elementplus minio springboot 实现大文件的分片上传、断点续传、秒传的功能demo - Gitee.com 后端暴露端口方法 获取上传进度&#xff0c;identifier…...

查出 product 表中所有 detail 字段包含 xxx 的完整记录

您可以使用以下 SQL 查询语句来查出 product 表中所有 detail 字段包含 oss.kxlist.com 的完整记录&#xff1a; SELECT * FROM product WHERE INSTR(detail, oss.kxlist.com) > 0;下面是detail字段包含的完整内容 <p><img style"max-width:100%;" src…...

Linux系统编程之信号基础知识

概述 信号是Linux系统中用于进程间通信的一种机制&#xff0c;允许一个进程通知另一个进程发生了某些特定事件。信号可以来自硬件中断、用户输入&#xff0c;也可以来自其他进程或者内核本身。信号是一种异步通知机制&#xff0c;当某个事件发生时&#xff0c;操作系统会向目标…...

【C语言标准库函数】标准输入输出函数详解[4]:二进制文件读写函数

目录 一、fread() 函数 1.1. 函数简介 1.2. fread 使用场景 1.3. 注意事项 1.4. 示例 二、fwrite() 函数 2.1. 函数简介 2.2. fwrite 使用场景 2.3. 注意事项 2.4. 示例 三、总结 在 C 语言中&#xff0c;二进制文件读写函数允许以二进制形式对文件进行读写操作&…...

图像锐化(QT)

如果不使用OpenCV&#xff0c;我们可以直接使用Qt的QImage类对图像进行像素级操作来实现锐化。锐化算法的核心是通过卷积核&#xff08;如拉普拉斯核&#xff09;对图像进行处理&#xff0c;增强图像的边缘和细节。 以下是一个完整的Qt应用程序示例&#xff0c;展示如何使用Qt…...

Apache Kafka 消息清理之道

前言 消息的清理是 MQ 中间件的基本能力&#xff0c;可以避免 MQ 的存储占用空间无序增长。与其他消息产品不同&#xff0c;Apache Kafka(以下简称 Kafka) 中 topic 上的消息被消费后不会被马上清除&#xff0c;而是由 topic 级别的清理策略来控制。本文将简要介绍 Kafka 中的…...

JVM ①-类加载 || 内存区域

这里是Themberfue 终于结束了网络层的学习&#xff0c;当然&#xff0c;我们学习的知识也只是冰山一角&#xff0c;想要了解更多的知识&#xff0c;还请大家养成主动探索的习惯~~~接下来我们将对 JVM 的一些机制进行简单的讲解&#xff0c;对于 Java程序员来说&#xff0c;本身…...

物理信息机器学习(PIML)的基础探讨及技术实现

在传统机器学习方法迅速发展并在图像识别、语音处理、自然语言处理等领域取得显著突破的同时,科学计算、工程设计以及自然系统建模等领域常常面临数据不足、噪声干扰以及模型泛化能力弱的问题。单纯依赖数据驱动的“黑箱”模型在处理物理问题时,往往难以兼顾数据拟合与物理解…...

【浏览器多开】Google Chrome 谷歌浏览器分身术

谷歌浏览器分身术&#xff08;多开&#xff09;&#xff1a; 复制已有谷歌浏览器图标—>右键–>属性的目标栏中&#xff0c;添加 --user-data-dir自定义文件夹路径 参数。 例如&#xff1a; C:\MySpace\02Installed\Chrome\Chrome-bin\99.0.4844.51\chrome.exe –user-d…...

《量化绿皮书》Chapter 3 Calculus and Linear Algebra 微积分与线性代数(二)

《A Practical Guide To Quantitative Finance Interviews》&#xff0c;被称为量化绿皮书&#xff0c;是经典的量化求职刷题书籍之一&#xff0c;包含以下七章&#xff1a; Chapter 1 General Principles 通用技巧 Chapter 2 Brain Teasers 脑筋急转弯 Chapter 3 Calculus and…...

单片机成长之路(51基础篇) - 008 C51 的标示符和关键字

标准 C 语言定义了 32 个关键字&#xff0c;如下表(ANSI C的32个关键字)&#xff1a; C51在此基础上针对单片机功能进行了扩展&#xff0c;详情见下表(C51编译器扩充关键字)&#xff1a; C 51的数据类型 51单片机使用的C语言的存储器类型分为以下几种&#xff1a;...

嵌入式AI革命:DeepSeek开源如何终结GPU霸权,开启单片机智能新时代?

2025年&#xff0c;全球AI领域最震撼的突破并非来自算力堆叠的超级模型&#xff0c;而是中国团队DeepSeek通过开源策略&#xff0c;推动大模型向微型化、低功耗场景的跨越。相对于当人们还在讨论千亿参数模型的训练成本被压缩到600万美金而言&#xff0c;被称作“核弹级别”的操…...

Deno vs Node.js:性能对比深度解析

1. 引言 Deno 和 Node.js 都是基于 V8 引擎的 JavaScript 运行时环境&#xff0c;然而它们在架构、模块管理、安全性和性能方面存在显著差异。Deno 由 Node.js 的原始作者 Ryan Dahl 开发&#xff0c;旨在解决 Node.js 设计上的一些问题&#xff0c;比如包管理、安全模型和 Ty…...

【R】Dijkstra算法求最短路径

使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data&#xff0c;存放有向图信息 data中每个点所在的行序号为起始点序号&#xff0c;列为终点序号。 比如&#xff1a;值4的坐标为(1,2)即点1到点2距离为4&#xff1b;值8的坐标为(6,7)…...

网络安全治理架构图 网络安全管理架构

网站安全攻防战 XSS攻击 防御手段&#xff1a; - 消毒。 因为恶意脚本中有一些特殊字符&#xff0c;可以通过转义的方式来进行防范 - HttpOnly 对cookie添加httpOnly属性则脚本不能修改cookie。就能防止恶意脚本篡改cookie 注入攻击 SQL注入攻击需要攻击者对数据库结构有所…...

@emotion/styled / styled-components创建带有样式的 React 组件

一、安装依赖 npm install emotion/styled styled-components 二、使用 import styled from emotion/styled; import styled from styled-components;// 创建一个带样式的按钮 const StyledButton styled.buttonbackground-color: #4caf50;color: white;padding: 10px 20px…...

Gemini 2.0模型更新:谷歌最新AI大模型全面开启智能时代

引言 2025年2月5日&#xff0c;谷歌人工智能实验室&#xff08;Google DeepMind&#xff09;发布了最新的Gemini 2.0模型系列更新&#xff0c;包括2.0 Flash、Flash-Lite和Pro实验版本。这些AI大模型的发布标志着人工智能技术在性能、效率和多模态能力上的进一步突破&#xff…...

MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理 MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志…...

详解在Pytest中忽略测试目录的三种方法

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 你是否曾因无关或过时的代码导致测试失败&#xff1f; 这可能会增加调试和故障排除…...

ZoneMinder index.php存在SQL注入漏洞(CVE-2024-43360)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

【DeepSeek】DeepSeek概述 | 本地部署deepseek

目录 1 -> 概述 1.1 -> 技术特点 1.2 -> 模型发布 1.3 -> 应用领域 1.4 -> 优势与影响 2 -> 本地部署 2.1 -> 安装ollama 2.2 -> 部署deepseek-r1模型 1 -> 概述 DeepSeek是由中国的深度求索公司开发的一系列人工智能模型&#xff0c;以其…...

webGL

WebGL&#xff1a;3D图形的网络标准 WebGL&#xff08;Web Graphics Library&#xff09;是一种3D绘图协议&#xff0c;它允许开发者在不需要任何插件的情况下&#xff0c;在网页浏览器中创建交互式2D和3D效果。WebGL是基于OpenGL ES的JavaScript API&#xff0c;它可以为HTML5…...

电脑远程控制vivo手机,切换按钮就能让vivo仅投屏、不受控制!

Linux系统在全球的市场份额并不高&#xff0c;继而很多便捷的软件都没有Linux的版本。如果想要用Linux远程控制安卓手机&#xff0c;找软件会比较麻烦&#xff0c;但是AirDroid网页版可以做到。 以vivo手机为例子&#xff0c;接下来讲解Linux系统电脑要远程控制安卓手机时&…...

MS17-010(永恒之蓝1.0)漏洞远程控制win7系统操作实战小白通俗易懂

1.准备环境win7操作系统&#xff08;被攻击机&#xff09;以及kali系统&#xff08;攻击机&#xff09;&#xff0c;kali使用msf工具进行攻击。 2.打开kali终端&#xff0c;进入msf&#xff0c;输入msfconsole然后等待启动。 ┌──(root㉿kali-chifan)-[~] └─# msfconsole…...

【Java计算机毕业设计】基于Springboot+Vue社区志愿者管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…...

三次握手,四次挥手,服务器模型(多进程并发,线程),基于套接字的UDP通信

三次握手&#xff1a; 第一次握手&#xff1a;客户端向服务器发送SYN待确认数据x, 客户端进入SYN_SEND状态​ 第二次握手&#xff1a;服务器向客户端回传一条ACK应答数据x1, 同时发送一条SYN待确认数据y&#xff0c;服务器进入SYN_RECV状态​ 第三次握手&#xff1a;客户端向服…...

通讯录管理小程序

通讯录管理系统 是对c基础语法的巩固&#xff0c;比较简单的一个小程序&#xff0c;重点在于养成良好的c代码习惯。 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统 下面是一些需要实现的功能&#xff1a; 1. 添加联系人 功能描述&…...

[ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别

前言 PlatformIO与Arduino在添加第三方库方面的原理存在显著差异 在PlatformIO中&#xff0c;第三方库的使用是基于项目&#xff08;工程&#xff09;的。具体而言&#xff0c;只有当你为一个特定的项目添加了某个第三方库后&#xff0c;该项目才能使用该库。这些第三方库的文…...

SpringSecurity:授权服务器与客户端应用(入门案例)

文章目录 一、需求概述二、开发授权服务器1、pom依赖2、yml配置3、启动服务端 三、开发客户端应用1、pom依赖2、yml配置3、SecurityConfig4、接口5、测试 一、需求概述 maven需要3.6.0以上版本 二、开发授权服务器 1、pom依赖 <dependency><groupId>org.springfr…...

k8s证书过期怎么更新?

在 Kubernetes 集群中&#xff0c;证书过期可能导致集群不可用&#xff0c;尤其是 API Server、Controller Manager、Scheduler 等组件所使用的证书。为了恢复集群的正常运行&#xff0c;您需要更新这些证书。以下是更新 Kubernetes 证书的基本步骤&#xff1a; 1. 检查证书状…...

【戒抖音系列】短视频戒除-1-对推荐算法进行干扰

如今推荐算法已经渗透到人们生活的方方面面&#xff0c;尤其是抖音等短视频核心就是推荐算法。 【短视频的危害】 1> 会让人变笨&#xff0c;慢慢让人丧失注意力与专注力 2> 让人丧失阅读长文的能力 3> 让人沉浸在一个又一个快感与嗨点当中。当我们刷短视频时&#x…...

VUE 集成企微机器人通知

message-robot 便于线上异常问题及时发现处理&#xff0c;项目中集成企微机器人通知&#xff0c;及时接收问题并处理 企微机器人通知工具类 export class MessageRobotUtil {constructor() {}/*** 发送 markdown 消息* param robotKey 机器人 ID* param title 消息标题* param…...

封装descriptions组件,描述,灵活

效果 1、组件1&#xff0c;dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…...