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

Java异常处理之旅:解救迷失的程序员(二)

本系列文章简介:

        在编程世界中,程序员们常常会遇到各种各样的问题和挑战。有时候,这些问题很容易解决,而有时候,它们却会让我们感到迷失和无助。

        在这个旅程中,我们将探索Java异常处理的世界,解救那些迷失的程序员们。异常处理是Java编程中至关重要的一个方面,它可以帮助我们识别和处理程序中的错误。然而,许多程序员在处理异常时常常感到困惑和困扰。

        在这个旅程中,我们将从异常的基本概念开始,了解异常是什么、为什么会发生以及如何处理它们。我们将学习异常的层次结构,了解不同类型的异常以及它们之间的关系。我们还将探讨异常处理的最佳实践,并学习如何编写清晰、健壮和可维护的异常处理代码

        在这个旅程中,你将学会如何从迷失的状态中恢复过来,如何解决程序中的错误,并如何成为一个自信和熟练的异常处理专家。无论你是一个初学者还是一个有经验的程序员,这个旅程都将为你带来新的知识和技能。

        让我们一起开始这段Java异常处理之旅,解救那些迷失的程序员们!

        欢迎大家订阅《Java技术栈高级攻略》专栏,一起学习,一起涨分!

目录

一、前言

二、常见异常及处理方式

2.1 NullPointerException

2.2 ArrayIndexOutOfBoundsException

2.3 ClassNotFoundException

2.4 IOException

2.5 SQLException

三、异常处理的最佳实践

3.1 异常处理的原则

3.2 日志记录

3.3 友好提示与用户交互

3.4 异常处理框架与工具

四、结语


一、前言

        异常是指在程序运行过程中出现的意外情况或错误。当程序遇到异常时,它会终止当前的执行流程,并尝试在异常处理程序中处理或解决异常。异常可以包括语法错误、逻辑错误、计算错误、输入错误等等。异常的处理是一种防止程序崩溃和提升程序稳定性的机制。在处理异常时,可以捕获异常、抛出异常、处理异常等操作。异常处理的目的是能够在出现异常时恢复程序的正常执行,或者提供出错信息,或者进行异常终止程序。

        本文将跟随《Java异常处理之旅:解救迷失的程序员(一)》的进度,继续介绍Java异常处理。希望通过本系列文章的学习,您将能够更好地理解Java异常处理的内部工作原理,掌握Java异常处理的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Java异常处理的潜力,为系统的高效运行提供有力保障。

二、常见异常及处理方式

2.1 NullPointerException

NullPointerException是Java中的一种异常情况,通常发生在使用空引用(null)的情况下。当程序尝试通过一个空引用访问对象的实例变量或者调用对象的实例方法时,就会抛出NullPointerException。

例如,以下代码会抛出NullPointerException异常:

String str = null;
int length = str.length(); // 尝试通过空引用访问实例方法length()

在上述代码中,变量str被赋值为null,这意味着它不指向任何有效的String对象。当我们尝试调用str对象的length()方法时,就会抛出NullPointerException异常,因为没有一个有效的对象来调用该方法。

为了避免NullPointerException异常,我们可以在使用引用之前进行非空检查,或者使用条件语句来处理可能为空的情况。

例如,使用条件语句来处理可能为空的情况:

String str = null;
if (str != null) {int length = str.length();
}

在上述代码中,我们在使用str对象之前检查它是否为空。只有当str对象不为空时,我们才会调用其length()方法。

总之,NullPointerException是Java中常见的异常情况,会在使用空引用的情况下抛出。为了避免NullPointerException异常,我们应该在使用引用之前进行非空检查或者使用条件语句来处理可能为空的情况。

2.2 ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException是Java中的一种异常,表示数组索引越界。当程序尝试访问数组的元素时,如果索引超出了数组的边界,就会抛出此异常。

例如,如果一个数组有5个元素,索引范围是0~4,但是当程序尝试访问索引为5的元素时,就会抛出ArrayIndexOutOfBoundsException异常。

以下是一个示例代码,演示了如何触发ArrayIndexOutOfBoundsException异常:

public class ArrayExample {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};for (int i = 0; i <= numbers.length; i++) {System.out.println(numbers[i]);}}
}

在上述代码中,由于循环的条件是 i <= numbers.length,当 i 的值等于数组的长度即5时,尝试访问 numbers[5] 就会抛出ArrayIndexOutOfBoundsException异常。正确的循环条件应该是 i<numbers.length

2.3 ClassNotFoundException

ClassNotFoundException是Java中的一个异常类,它表示在运行时找不到某个类的情况。

通常情况下,当Java虚拟机(JVM)试图加载一个类时,它会从类路径(classpath)中搜索类的字节码文件。如果在类路径中找不到对应的字节码文件,就会抛出ClassNotFoundException异常。

ClassNotFoundException通常出现在以下几种情况下:

  1. 类路径不正确:如果类路径中没有包含要加载的类的字节码文件,就会抛出ClassNotFoundException异常。需要确保类路径正确且包含了要加载的类。

  2. 类名错误:如果要加载的类名写错了,或者包名和类名不匹配,也会抛出ClassNotFoundException异常。需要检查类名的拼写和包名的正确性。

  3. 缺少依赖包:如果要加载的类依赖其他的类或库,但是这些类或库没有被正确地添加到类路径中,就会抛出ClassNotFoundException异常。需要确保所有的依赖包都已经正确地添加到类路径中。

当出现ClassNotFoundException异常时,通常需要检查以上几种情况,确保类的字节码文件存在于类路径中,并且类名和包名正确。如果仍然无法解决问题,可能需要进一步检查与该类相关的依赖关系和类加载机制。

2.4 IOException

在Java中,IOException是一个继承自Exception的异常类,它表示输入输出操作可能发生的错误。它是一个checked异常,意味着在编译时必须处理它,否则会引发编译错误。

IOException涵盖了多个可能的输入输出异常,包括读取或写入文件时的错误、网络连接错误、设备故障等。一些常见的IOException子类包括FileNotFoundException(文件不存在)、SocketException(网络连接错误)、EOFException(遇到文件结束)等。

在Java中处理IOException通常使用try-catch块来捕获和处理异常。例如:

try { // 执行可能引发IOException的操作 } catch (IOException e) { // 异常处理逻辑 } 这样可以在出现异常时执行指定的异常处理逻辑,以避免应用程序崩溃或出现错误状态。

2.5 SQLException

在Java中,SQLException是一个用于处理与数据库相关的异常的类。它是一个受检异常,表示在使用JDBC(Java Database Connectivity)过程中发生了错误。

SQLException类提供了以下一些常用方法:

  1. getMessage():获取异常的详细信息。
  2. getErrorCode():获取数据库特定的错误代码。
  3. getSQLState():获取数据库特定的SQL状态代码。
  4. getNextException():获取链中的下一个异常对象。
  5. printStackTrace():打印异常的堆栈跟踪信息。

SQLException通常在以下情况下抛出:

  1. 数据库连接错误:无法连接到数据库或数据库连接超时。
  2. 无效的SQL语句或语法错误:执行的SQL语句格式不正确,或者存在语法错误。
  3. 数据库操作错误:例如插入、更新或删除数据时失败。
  4. 数据库资源不足:例如,连接数超过数据库允许的最大值。
  5. 事务处理错误:例如回滚事务时发生错误。

处理SQLException的常见做法是使用try-catch语句来捕获并处理异常,可以根据具体的情况选择合适的处理方式,例如输出日志、回滚事务、关闭数据库连接等。

三、异常处理的最佳实践

3.1 异常处理的原则

在Java中,异常处理的原则包括以下几点:

  1. 异常处理应该在能够处理异常的地方进行,而不是简单地把异常抛给上层调用者。

  2. 异常处理应该具有针对性,即根据具体的异常类型进行处理,而不是简单地进行泛化的处理。这样可以更准确地定位和修复问题。

  3. 异常处理应该提供恰当的错误信息,以便于排查和修复问题。错误信息应该包括异常类型、异常信息、异常发生的位置等相关信息。

  4. 异常处理应该根据具体的业务需求进行,可以选择忽略异常、记录异常日志、抛出新的异常等方式来处理异常。

  5. 异常处理应该遵循从具体到抽象、从小范围到大范围的原则,即先处理具体的异常,再处理抽象的异常,先处理范围较小的异常,再处理范围较大的异常。

  6. 异常处理应该避免捕获所有异常的泛化处理,而应该根据具体需要选择捕获特定的异常或者捕获一组相关的异常。

  7. 异常处理应该避免过度依赖异常处理机制,而应该通过预防措施来避免异常的发生,例如使用合适的输入验证、加入合适的代码检查等。

总之,异常处理应该是代码编写中的一个重要方面,合理的异常处理可以提高程序的可靠性和可维护性。

3.2 日志记录

在Java中,日志记录是一种常见的技术,用于记录系统或应用程序运行时的关键信息,以便于后续的调试和问题排查。Java提供了多种实现日志记录的方式,其中最常用的是使用Java标准库中的日志API(java.util.logging)和常用的第三方库,如Log4j和Slf4j。

使用Java标准库中的日志API(java.util.logging)可以通过以下步骤实现日志记录:

  1. 导入java.util.logging包中的相关类和接口:
    import java.util.logging.Logger;
    

    在类中定义Logger对象:

  2. private static final Logger logger = Logger.getLogger(ClassName.class.getName());
    

    这里的ClassName是当前类的名称,通过调用Logger.getLogger()方法获取Logger对象。

  3. 在需要记录日志的地方调用Logger对象的相应方法,如info(), warning(), severe()等:
    logger.info("This is an info log.");
    logger.warning("This is a warning log.");
    logger.severe("This is a severe log.");
    

    除了Java标准库中的日志API外,还可以使用第三方库来实现日志记录。其中,Log4j和Slf4j是常用的第三方日志库。

使用Log4j进行日志记录的步骤如下:

  1. 导入相应的Log4j类和接口:
    import org.apache.log4j.Logger;
    

    在类中定义Logger对象:

  2. private static final Logger logger = Logger.getLogger(ClassName.class);
    

    配置log4j.properties文件,用于指定日志记录的级别、输出目标等配置信息。在该文件中可以指定日志记录的级别、输出目标(控制台、文件)、日志格式等。

  3. 在需要记录日志的地方调用Logger对象的相应方法:
    logger.info("This is an info log.");
    logger.warn("This is a warning log.");
    logger.error("This is an error log.");
    

    使用Slf4j进行日志记录的步骤如下:

  4. 导入相应的Slf4j类和接口:
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    

    在类中定义Logger对象:

  5. private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
    

    配置slf4j.properties文件,用于指定日志记录的级别、输出目标等配置信息。在该文件中可以指定日志记录的级别、输出目标(控制台、文件)、日志格式等。

  6. 在需要记录日志的地方调用Logger对象的相应方法:
    logger.info("This is an info log.");
    logger.warn("This is a warning log.");
    logger.error("This is an error log.");
    

    以上是Java中常见的日志记录方式,通过选择合适的日志库和相应的配置,可以灵活地进行日志记录和管理。

3.3 友好提示与用户交互

在Java中,可以使用System.out.println()或System.out.print()方法向用户提供友好的提示信息。这些方法可以在控制台上打印出文本,向用户提供指导或提示。

另外,通过使用Scanner类,可以与用户进行交互。Scanner类提供了一些方便的方法,如next()、nextInt()、nextLine()等,可以用于接收用户的输入。使用这些方法,可以要求用户输入某些值,并将其存储在变量中,以便在程序的其他地方使用。

下面是一个简单的例子,演示了如何使用System.out.println()和Scanner类来与用户交互:

import java.util.Scanner;public class UserInteractionExample {public static void main(String[] args) {// 使用System.out.println()输出友好的提示信息System.out.println("请输入您的姓名:");// 创建Scanner对象Scanner scanner = new Scanner(System.in);// 使用Scanner对象的nextLine()方法接收用户的输入String name = scanner.nextLine();// 使用System.out.println()输出用户输入的姓名System.out.println("您的姓名是:" + name);// 关闭Scanner对象scanner.close();}
}

在上述示例中,程序首先打印出友好的提示信息"请输入您的姓名:",然后创建了一个Scanner对象,通过调用nextLine()方法接收用户输入的姓名,并将其存储在name变量中。最后,程序使用System.out.println()输出用户输入的姓名。

需要注意的是,在使用Scanner类时,最好在不再需要它时关闭它,以释放资源。在上述示例中,使用了scanner.close()方法来关闭Scanner对象。

3.4 异常处理框架与工具

在Java中,有以下几种异常处理框架和工具:

  1. try-catch-finally:这是Java提供的最基本的异常处理机制。可以使用try块来包裹可能抛出异常的代码,然后使用catch块来捕获并处理异常,最后可以使用finally块来执行清理工作,无论是否发生异常都会执行。

  2. throws关键字:在方法的声明中可以使用throws关键字来声明该方法可能抛出的异常。这样,在调用该方法时,必须要么捕获该异常,要么继续向上抛出。

  3. try-with-resources:这是Java 7引入的一个新特性。它可以自动关闭资源,无论是否发生异常。可以在try语句中声明和初始化资源,然后在try语句结束时,将自动关闭该资源。

  4. 异常类和异常类层次结构:Java中的异常类是按照一定的层次结构组织的。Throwable是所有异常和错误的超类,它有两个子类:Error和Exception。Exception又有两个子类:RuntimeException和CheckedException。RuntimeException是可以被程序员预料并且合理地处理的异常,而CheckedException需要在方法签名中声明或捕获,否则编译器会报错。

  5. 异常处理工具:除了Java语言本身的异常处理机制外,还有一些第三方的异常处理工具可供使用。比如,Apache Commons Lang库提供了一些额外的异常处理工具类,如ExceptionUtils和StackTraceUtils,可以方便地处理和分析异常信息。另外,一些日志框架,如log4j和logback,也提供了异常处理的功能,可以将异常信息记录到日志中。

总结起来,Java中的异常处理框架和工具主要包括try-catch-finally,throws关键字,try-with-resources,异常类和异常类层次结构,以及第三方的异常处理工具。这些机制和工具可以帮助开发者更好地处理和分析异常,提高程序的健壮性和可靠性。

四、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

相关文章:

Java异常处理之旅:解救迷失的程序员(二)

本系列文章简介&#xff1a; 在编程世界中&#xff0c;程序员们常常会遇到各种各样的问题和挑战。有时候&#xff0c;这些问题很容易解决&#xff0c;而有时候&#xff0c;它们却会让我们感到迷失和无助。 在这个旅程中&#xff0c;我们将探索Java异常处理的世界&#xff0c;解…...

网络安全介绍

网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统能够连续可靠正常地运行&#xff0c;网络服务不中断。以下是一些网络安全相关的方面&#xff1a; 首先&#xff0c;随着科学技术的进…...

分享一个好看的APP下载分发页,App Store风格

分享一个好看的APP下载分发页&#xff0c;App Store风格 可以自动识别安卓和苹果哦&#xff01; 内容直接可以页面上修改&#xff0c;所见即所得 下图是一个真实截图&#xff0c;想要的留下评论哦&#xff01;...

C++ 获取数组大小、多维数组操作详解

获取数组的大小 要获取数组的大小&#xff0c;可以使用 sizeof() 运算符&#xff1a; 示例 int myNumbers[5] {10, 20, 30, 40, 50}; cout << sizeof(myNumbers);结果&#xff1a; 20为什么结果显示为 20 而不是 5&#xff0c;当数组包含 5 个元素时&#xff1f; 这…...

苹果电脑怎么彻底删除软件 苹果电脑卸载软件在哪里 cleanmymac x怎么卸载 mac废纸篓怎么删除

苹果电脑卸载软件的方法相对直观和简单&#xff0c;尤其是对于习惯使用Mac操作系统的用户来说。以苹果MacBook Pro为例&#xff0c;以下是卸载软件的详细步骤、使用方法、注意事项与建议。 一、卸载软件的详细步骤&#xff1a; 1. 打开Mac电脑&#xff0c;进入桌面&#xff0c…...

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟…...

WebGPU vs. 像素流

在构建 Bzar 之前&#xff0c;我们讨论过我们的技术栈是基于在云上渲染内容的像素流&#xff0c;还是基于使用设备自身计算能力的本地渲染技术。 由于这种选择会极大地影响项目的成本、可扩展性和用户体验&#xff0c;因此在开始编写一行代码之前&#xff0c;从一开始就采取正确…...

Windows下docker-compose部署DolphinScheduler

参照&#xff1a;快速上手 - Docker部署(Docker) - 《Apache DolphinScheduler v3.1.0 使用手册》 - 书栈网 BookStack 下载源文件 地址&#xff1a;https://dolphinscheduler.apache.org/zh-cn/download/3.2.1 解压到指定目录&#xff0c;进入apache-dolphinscheduler-xxx-…...

微服务项目sc2024通用Base工程

1. cloud-provider-payment8001 2.pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"ht…...

git学习 1

打开自己想要存放git仓库的文件夹&#xff0c;右键打开git bush&#xff0c;用git init命令建立仓库 用 ls -a(表示全都要看&#xff0c;包括隐藏的)可以看到git仓库 也可以用 git clone 接github链接&#xff08;点code选项里面会给链接&#xff0c;结尾是git的那个&#xf…...

HTML - 请你说一下如何阻止a标签跳转

难度级别:初级及以上 提问概率:55% a标签的默认语义化功能就是超链接,HTML给它的定位就是与外部页面进行交流,不过也可以通过锚点功能,定位到本页面的固定id区域去。但在开发场景中,又避免不了禁用a标签的需求,那么都有哪些方式可以禁用…...

【CV】ORB算法

1. ORB算法&#xff1a; 特点&#xff1a; 实现了旋转不变性、尺度不变性和计算效率高等特性。 旋转不变性&#xff1a; 通过计算关键点周围的梯度信息&#xff0c;确定关键点的主方向。将图像旋转到关键点的主方向&#xff0c;然后再提取BRIEF描述符&#xff0c;增强了旋转不…...

【算法】Cordic算法的原理及matlab/verilog应用

一、前言 单片机或者FPGA等计算能力弱的嵌入式设备进行加减运算还是容易实现&#xff0c;但是想要计算三角函数&#xff08;sin、cos、tan&#xff09;&#xff0c;甚至双曲线、指数、对数这样复杂的函数&#xff0c;那就需要费些力了。通常这些函数的计算需要通者查找表或近似…...

QT:信号与槽

作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…...

以动态库链接库 .dll 探索结构体参数

Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后&#xff0c;尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个&#xff0c;dll.dll是上面提到…...

vue快速入门(三)差值表达式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 插值表达式基本用法插值表达式常用公式 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…...

RabbitMQ的交换机与队列

一、流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&am…...

Spring的 IOC和AOP编程思想

Spring的IOC&#xff08;控制反转&#xff09;编程思想 IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是Spring框架的核心思想之一。在传统的编程方式中&#xff0c;我们直接通过new关键字来创建对象&#xff0c;并直接调用对象的方法。这种方式下&am…...

Qt中显示hex数据的控件

效果类似QTextEdit&#xff0c;但是显示十六进制的数据&#xff0c;比如用于显示抓取串口或者bin文件的数据等等 chunks.h #ifndef CHUNKS_H #define CHUNKS_H/** \cond docNever *//*! The Chunks class is the storage backend for QHexEdit.** When QHexEdit loads data, C…...

python web 开发 - 常用Web框架

python web 开发 - 文章目录 python web 开发 -1、关于Web开发2、常用Web框架3、开发案例3.1. 使用Flask框架创建一个简单的Web应用程序3.2. 使用tornado框架创建一个简单的Web应用程序3.3. 使用Django框架创建一个简单的待办事项应用程序 4、总结 1、关于Web开发 Web当然是网…...

设计模式——适配器模式06

适配器模式 通常在已有程序中使用&#xff0c;至少有两个类的接口不兼容时&#xff0c;让相互不兼容的类能很好地合作。例如之前系统 用的Target 接口调用&#xff0c;现在要新增第三方接口Adaptee。如何进行适配&#xff0c;面向客户端提供 调用Target接口方式达到使用Adaptee…...

【鸿蒙开发】组件状态管理@Prop,@Link,@Provide,@Consume,@Observed,@ObjectLink

1. Prop 父子单向同步 概述 Prop装饰的变量和父组件建立单向的同步关系&#xff1a; Prop变量允许在本地修改&#xff0c;但修改后的变化不会同步回父组件。当父组件中的数据源更改时&#xff0c;与之相关的Prop装饰的变量都会自动更新。如果子组件已经在本地修改了Prop装饰…...

Web 前端性能优化之八:前端性能检测实践

五、前端性能检测实践 1、常用的检测工具 Lighthouse、Chrome开发者工具中与性能检测相关的一些工具面板、页面加载性能分析工具PageSpeed Insights、专业的性能检测工具WEBPAGETEST等 1、Chrome 任务管理器 通过Chrome任务管理器我们可以查看当前Chrome浏览器中&#xff0…...

安装VMware ESXi虚拟机系统

简介&#xff1a;ESXi是VMware公司开发的一款服务器虚拟化操作系统。它能够在一台物理服务器上运行多个虚拟机&#xff0c;每个虚拟机都可以独立运行操作系统和应用程序&#xff0c;而且对硬件配置要求低&#xff0c;系统运行稳定。 准备工具&#xff1a; 1.8G或者8G以上容…...

Vue3实践之全局请求URL配置和请求参数说明

Vue3实践之全局请求URL配置和请求参数说明 全局请求URL配置 1、首先需要导入router和axios import router from "/router";2、创建app&#xff0c;将router挂载到app上 const app createApp(App) app.use(router).use(elementIcons).mount(#app)3、设置全局请求…...

类和对象—初阶

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 【面试题】 4.2 封装 【面试题】 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式 7.3 结构体内存对齐规则 【面试题】…...

【Linux】shell 脚本基础使用

在终端中输入命令可以完成一些常用的操作&#xff0c;但是我们都是一条一条输入命令&#xff0c;比较麻烦&#xff0c;为了解决这个问题&#xff0c;就会涉及到 shell 脚本&#xff0c;它可以将很多条命令放到一个文件里面&#xff0c;然后直接运行这个文件即可。 shell 脚本类…...

nfs部署--相关记录

以下是在 CentOS 8 中将 10.40.111.41 上的 /nfsdata 目录通过 NFS 共享到 10.40.111.43 和 10.40.111.45 的 /nfsdata 目录的详细步骤&#xff1a; 在 10.40.111.41 上操作&#xff1a; 安装并配置 NFS 服务器&#xff1a; a. 安装 NFS 服务器软件包&#xff1a; sudo dnf in…...

java国产化云HIS基层医院系统源码 SaaS模式

目录 ​ 云HIS开发环境 功能模块介绍&#xff1a; 1、门诊模块 2、住院模块 3、药房、药库模块 ​编辑 4、电子病历模块 5、统计报表模块 6、系统管理模块 系统优势 云his之电子病历子系统功能 云 his 系统是运用云计算、大数据、物联网等新兴信息技术&#xff0c;按…...

docker 部署 Epusdt - 独角数卡 dujiaoka 的 usdt 支付插件

部署 部署说明 部署之前必须注意的几点事项,该教程不一定适合所有用户: 本教程主要是使用 docker 部署,宝塔用户或宿主机直接安装的用户请直接参考官网教程.本教程是独立部署 epusdt,使用独立的mysql和redis,与dujiaoka项目分开. 在研究的过程中发现 epusdt 也需要用到 mys…...