Java入门第三季

news2024/11/14 3:54:18

一、异常与异常处理

1. 异常简介

在Java中,**异常是程序在执行过程中出现的问题或意外情况,导致程序无法按照预期的流程进行。**异常处理是Java中用于处理程序中出现的异常的一种机制。

Java中的异常可以分为两大类:受检查的异常(Checked Exceptions)和未受检查的异常(Unchecked Exceptions)

1. 受检查的异常(Checked Exceptions):这些异常在编译时会被检查,必须显式地处理它们。例如,IOException、ClassNotFoundException等。
如果一个方法可能会抛出受检查的异常,那么该方法要么必须通过try-catch块来捕获并处理该异常,要么必须在方法签名中使用throws关键字来声明该异常。

try {  
    // 可能会抛出IOException的代码  
} catch (IOException e) {  
    // 处理IOException的代码  
}


2. 未受检查的异常(Unchecked Exceptions):这些异常在编译时不会进行检查,它们通常表示程序中的逻辑错误或运行时错误。例如,NullPointerException、ArrayIndexOutOfBoundsException等。如果一个方法可能会抛出未受检查的异常,那么该方法不需要在方法签名中使用throws关键字来声明该异常。

try {  
    // 可能会抛出NullPointerException的代码  
} catch (NullPointerException e) {  
    // 处理NullPointerException的代码  
}

除了try-catch块外,Java还提供了其他几种异常处理机制,包括:

  • throws关键字:用于声明一个方法可能会抛出哪些受检查的异常。
  • finally块:无论try块中是否发生异常,finally块中的代码都会执行。通常用于资源的清理操作,如关闭文件、数据库连接等。
  • throw关键字:用于在方法内部手动抛出异常。当程序中发生异常时,可以使用throw关键字抛出异常,然后将其传递给调用该方法的代码进行处理。
  • Java标准库中提供的多种异常类:Java标准库中提供了许多预定义的异常类,如IOException、SQLException等。这些异常类可以用于表示各种不同的错误情况,并且可以自定义新的异常类来表示应用程序特有的错误情况。


2.异常处理

在Java中,我们使用try-catch-finally语句块来处理异常。
try块包含可能会引发异常的代码,catch块用于捕获并处理特定的异常,而finally块包含的代码无论是否发生异常都会执行。

下面是一个简单的例子:

public class Main {  
    public static void main(String[] args) {  
        try {  
            // 可能会引发异常的代码  
            int result = divide(10, 0);  
            System.out.println("The result is " + result);  
        } catch (ArithmeticException e) {  
            // 处理特定的异常  
            System.out.println("Cannot divide by zero!");  
        } finally {  
            // 无论是否发生异常都会执行的代码  
            System.out.println("This code is executed in every case.");  
        }  
    }  
  
    public static int divide(int a, int b) {  
        if (b == 0) {  
            throw new ArithmeticException("Divisor cannot be zero");  
        }  
        return a / b;  
    }  
}

结论:在这个例子中,我们有一个方法divide,如果除数为0,它会抛出一个ArithmeticException。在main方法中,我们调用divide方法,并使用try-catch-finally语句块来处理可能发生的异常。

  • 如果除数不为0,那么程序会正常执行,并打印出结果。
  • 如果除数为0,那么会触发ArithmeticException,程序会跳到catch块,打印出"Cannot divide by zero!"。
  • 无论是否发生异常,finally块中的代码都会执行,打印出"This code is executed in every case."。

注意:如果可能抛出多个异常类型,你可以添加多个catch块来处理不同的异常。例如:

try {  
    // 可能会引发多种异常的代码  
} catch (ArithmeticException e) {  
    // 处理ArithmeticException  
} catch (NullPointerException e) {  
    // 处理NullPointerException  
} finally {  
    // 无论是否发生异常都会执行的代码  
}


3.异常抛出与自定义异常

在Java中,当一个方法遇到错误条件时,它会抛出一个异常。这是通过使用throw关键字完成的。

public class Main {  
    public static void main(String[] args) {  
        try {  
        	// 创建一个新的Exception异常并抛出
            throw new Exception("自定义异常");  
        }// 捕捉异常 
        catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

自定义异常,你也可以创建自定义的异常类,这通常是通过继承Exception类或其子类来完成的。下面是一个自定义异常的例子:在这个例子中,我们创建了一个新的MyException类,它继承了Exception类。然后我们在try-catch块中抛出并捕获这个自定义异常。

class MyException extends Exception {  
    public MyException(String message) {  
        super(message);  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        try {  
            throw new MyException("这是一个自定义异常");  
        } catch (MyException e) {  
            e.printStackTrace();  
        }  
    }  
}


4. 异常链

在Java中,异常链(Exception chaining)是一种机制,通过它可以将一个异常与导致它的异常(或多个异常)关联起来。

作用:提高了代码的可维护性和可读性。详细如下几点

  1. 提供更多的上下文信息:通过将多个异常关联在一起,可以提供关于异常发生时的更多上下文信息。这有助于更准确地诊断和解决问题。
  2. 追踪异常来源:通过使用异常链,可以在处理异常时更方便地追踪异常的来源。这有助于确定问题的根本原因,以及如何采取适当的措施来避免或解决该问题。
  3. 简化异常处理:异常链使开发人员能够将多个异常处理逻辑集中在一个地方,而不是为每个异常单独编写处理代码。这有助于简化异常处理逻辑,并提高代码的可维护性。
  4. 提供更详细的错误报告:通过将多个异常关联在一起,可以提供更详细的错误报告。这有助于开发人员更好地理解问题的性质和范围,从而能够更快地解决问题。

实现:

异常链可以通过Throwable类的initCause(Throwable cause)方法实现。该方法允许在创建新的异常时,将一个已存在的异常作为原因(cause)与它关联起来。
这样,在捕获并处理异常时,我们可以使用Throwable类的getCause()方法获取导致当前异常的原始异常。

public class ExceptionChainExample {  
    public static void main(String[] args) {  
        try {  
            // 引发第一个异常  
            throw new Exception("First exception");  
        } catch (Exception e) {  
            // 在第一个异常的基础上引发第二个异常  
            e = new Exception("Second exception", e);  
            throw e;  
        }  
    }  
}

在上面的代码中,我们首先抛出一个新的Exception对象,然后在捕获该异常时,我们创建一个新的Exception对象,并将原始的异常对象作为第二个参数传递给构造函数。这样,第二个异常就包含了导致它的原始异常。然后我们重新抛出这个新的异常。



当调用getCause()方法时,我们可以获取导致第二个异常的原始异常。

try {  
    // 引发第一个异常  
    throw new Exception("First exception");  
} catch (Exception e) {  
    // 在第一个异常的基础上引发第二个异常  
    e = new Exception("Second exception", e);  
    throw e;  
} catch (Throwable t) {  
    // 获取导致第二个异常的原始异常  
    Throwable cause = t.getCause();  
    System.out.println("Caused by: " + cause.getMessage());  
}

例如在上面的代码中,我们捕获了第二个异常,并使用getCause()方法获取导致该异常的原始异常。然后我们打印出原始异常的消息。输出结果为:“Caused by: First exception”。



二、字符串-String


定义

在Java中,字符串是一种不可变的对象,用于表示文本数据。字符串是由零个或多个字符组成的序列。Java中的字符串通常用双引号括起来,表示该字符串是一个字符串字面值。


不变性


Java中的字符串具有不变性,是因为它们在结构上是不可变的。字符串字面值被编译成字符数组,而这个字符数组被存储在只读内存中。 通过将字符串实现为字符数组,Java可以在内存中高效地操作字符串。

由于字符串是不可变的,当对字符串执行操作时,实际上是创建了一个新的字符串,而不是修改原始字符串。例如,当我们对字符串进行连接、切割或替换操作时,Java会创建新的字符串来保存操作的结果。 这种实现方式可以避免因为修改字符串而产生不必要的性能开销。

总的来说,Java中的字符串之所以具有不变性,是因为其底层结构是基于字符数组实现的,并且操作字符串时是通过创建新的字符串来实现的。 这种设计可以提高内存使用效率,并增强字符串的安全性。



常用方法

Java中的字符串类String提供了许多常用的方法,以下是一些常用的方法:

  • charAt(int index): 返回指定索引位置的字符。
  • length(): 返回字符串的长度。
  • substring(int beginIndex, int endIndex): 返回从beginIndex到endIndex之间的子字符串。
  • indexOf(String substring): 返回子字符串第一次出现的索引,如果未找到则返回-1。
  • lastIndexOf(String substring): 返回子字符串最后一次出现的索引,如果未找到则返回-1。
  • equalsIgnoreCase(String anotherString): 比较两个字符串的内容是否相同,不区分大小写。
  • startsWith(String prefix): 测试字符串是否以指定的前缀开始。
  • endsWith(String suffix): 测试字符串是否以指定的后缀结束。
  • replace(char oldChar, char newChar): 替换字符串中的所有指定字符为另一个字符。
  • replaceAll(String regex, String replacement): 使用正则表达式替换字符串中的所有匹配项。
  • toLowerCase(): 将字符串转换为小写。
  • toUpperCase(): 将字符串转换为大写。
  • trim(): 去除字符串两侧的空白字符和其他预定义的可忽略字符。

除了上述方法,String类还提供了许多其他方法,用于处理字符串的各种操作。另外,如果需要更高效的字符串操作,可以使用StringBuilder或StringBuffer类。



StringBuilder类

创建成功的字符串对象,长度是固定的,内容不能被改变与编译。虽然使用 + 运算符能够达到附加新字符或新字符串的目的,但是 + 运算符是产生一个新的String实例,创建一个新的字符串对象,如果大量的对字符串进行修改,会极大的增加系统开销。

例如:
在这里插入图片描述

StringBuilder类不是字符串,所以要创建StringBuilder类的对象,需要调用其构造方法。
可以传递以下参数进行构造。
在这里插入图片描述

格式:StringBuilder sb=new StringBuilder(参数);	
StringBuilder sb=new StringBuilder("123");

如果需要将StringBuilder类值,转换为Stirng类值呢?StringBuilder提供了toString方法,会将StringBuilder对象内的值转换为字符串进行返回。


所以我们可以将需要对字符串进行大量修改的操作转移到StringBuilder内进操作,操作完毕后再将其转换为字符串。这样就节省了大量的内存空间,提高了运行效率。



三、常用类库

在Java中,基本类型的包装类是对应于基本数据类型的类。它们可以将基本类型转换为对象,以便在需要对象参数的场合使用。这些包装类包括:Integer、Double、Boolean等等。

1. 基本类型的包装类:

  • 基本类型的包装类是将基本类型封装成对象,以便在需要对象参数的场合使用。
  • 每个基本类型都有一个对应的包装类,例如Integer、Double、Boolean等。
  • 包装类的主要作用是提供了一些方法来操作基本类型,例如将基本类型转换为字符串、进行算术运算等。

2. Date类:

  • 基本类型的包装类是将基本类型封装成对象,以便在需要对象参数的场合使用。
  • 每个基本类型都有一个对应的包装类,例如Integer、Double、Boolean等。
  • 包装类的主要作用是提供了一些方法来操作基本类型,例如将基本类型转换为字符串、进行算术运算等。

3. SimpleDateFormat类:

  • SimpleDateFormat类是一个日期时间格式化类,它可以将日期时间对象转换为字符串,也可以将字符串解析为日期时间对象。
  • 你可以使用SimpleDateFormat类的构造方法创建一个格式化对象,并指定日期时间的格式。
  • SimpleDateFormat类提供了一些方法来格式化日期时间,例如format()方法将日期时间对象格式化为字符串。
  • 另外,SimpleDateFormat类还提供了一些方法来解析字符串为日期时间对象,例如parse()方法将字符串解析为Date对象。

4. Calendar类:

  • Calendar类是Java的日期时间辅助类,它提供了一种方便的方式来处理日期和时间。
  • Calendar类提供了一些静态常量来表示日期和时间的各个部分,例如ERA、YEAR、MONTH、DAY_OF_MONTH等。
  • 你可以使用Calendar类的构造方法创建一个Calendar对象,并使用set()方法设置日期和时间的各个部分。
  • Calendar类还提供了一些方法来获取当前日期和时间的各个部分,例如get()方法获取指定字段的值。

5. Math类:

  • Math类是Java的数学辅助类,它提供了一些静态方法来执行常见的数学运算,例如sqrt()方法计算平方根、log()方法计算自然对数等。
  • Math类还包含一些常量和常用函数的值,例如PI表示π的值、E表示自然对数的底数等。
  • 你可以使用Math类的静态方法来执行数学运算,例如Math.sqrt(x)计算x的平方根。


总结:

通过学习这些常用类,你将能够更深入地理解Java中的基本数据类型,并能够进行基本类型和包装类之间的转换。你还可以掌握这些常用类的使用方法,以便在实际编程中更好地处理日期、时间和数学计算等问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux——zabbix

简介 官网:https://www.zabbix.com/ Zabbix 是一个开源的网络监控和警报解决方案。它允许管理员监控网络中的各种设备、服务器和应用程序,并收集有关它们性能和状态的数据。Zabbix 提供了一个集中化的管理界面,通过各种监控方式&#xff08…

大模型技术实践(三)|用LangChain和Llama 2打造心灵疗愈机器人

上期文章我们实现了Llama 2-chat-7B模型的云端部署和推理,本期文章我们将用“LangChainLlama 2”的架构打造一个定制化的心灵疗愈机器人。有相关知识背景的读者可以直接阅读「实战」部分。 01 背景 1.1 微调 vs. 知识库 由于大模型在垂直行业领域的问答效果仍有待提…

基于Simulink的用于电力系统动态分析

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

zemax双透镜公差分析

公差分析,就是在设计了一个理想的系统后,想看看实际生产过程中如果产生公差(误差),系统会坏到什么程度,也就是光学性能受到多大影响。 先设计出双透镜: 在zemax中找到公差选项卡,准…

算法专题:前缀和

文章目录 Acwing:前缀和示例2845.统计趣味子数组的数目思路容易理解的写法:前缀和两层循环存在问题:超时 优化写法:两数之和思路,转换为哈希表 前缀和,就是求数组中某一段的所有元素的和。 求子数组中某一…

输运方程的推导

1 概述 对于流场中守恒的物理量,均可采用输运方程(transport equation)进行描述其随时间变化和在空间的分布规律。输运方程的通用形式为: 输运方程描述了流动过程中的物理量守恒,其包括瞬态(transient&…

FPGA实战小项目2

基于FPGA的贪吃蛇游戏 基于FPGA的贪吃蛇游戏 基于fpga的数字密码锁ego1 基于fpga的数字密码锁ego1 基于fpga的数字时钟 basys3 基于fpga的数字时钟 basys3

ElMessageBox.prompt 点击确认校验成功后关闭

ElMessageBox.prompt(, 验证取货码, {inputPattern: /^.{1,20}$/,inputErrorMessage: 请输入取货码,inputPlaceholder: 请输入取货码,beforeClose: (action, instance, done) > {if (action confirm) {if (instance.inputValue) {let flag false;if (flag) {done()} else …

OpenCV(二十五):边缘检测(一)

目录 1.边缘检测原理 2.Sobel算子边缘检测 3.Scharr算子边缘检测 4.两种算子的生成getDerivKernels() 1.边缘检测原理 其原理是基于图像中灰度值的变化来捕捉图像中的边界和轮廓。梯度则表示了图像中像素强度变化的强弱和方向。 所以沿梯度方向找到有最大梯度值的像素&…

信息检索与数据挖掘 |(一)介绍

文章目录 📚信息检索🐇概念🐇结构化与非结构化数据🐇信息检索的基本假设🐇信息检索小结🐇附:IR新课题 📚数据挖掘🐇定义🐇数据挖掘 vs 机器学习 &#x1f4da…

论文笔记:一分类及其在大数据中的潜在应用综述

0 概述 论文:A literature review on one‑class classification and its potential applications in big data 发表:Journal of Big Data 在严重不平衡的数据集中,使用传统的二分类或多分类通常会导致对具有大量实例的类的偏见。在这种情况…

2023 大学生数学建模竞赛-C题-第一问

题目: 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此,商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销…

深入浅出PyTorch函数torch.rand与torch.randn

torch.rand 和 torch.randn 都是PyTorch中用于生成随机张量的函数,但它们生成随机数的方式有所不同。 一、torch.rand torch.rand 生成在区间 [0, 1) 内均匀分布的随机数。 size 参数是一个表示所需张量形状的元组或整数。可以生成任何形状的随机张量。 二、torch.…

1、Flutter移动端App实战教程【环境配置、模拟器配置】

一、概述 Flutter是Google用以帮助开发者在IOS和Android 两个平台开发高质量原生UI的移动SDK,一份代码可以同时生成IOS和Android两个高性能、高保真的应用程序。 二、渲染机制 之所以说Flutter能够达到可以媲美甚至超越原生的体验,主要在于其拥有高性…

相似性搜索,第 4 部分:分层可导航小世界 (HNSW)

一、说明 SImilarity 搜索是一个问题,给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。相似度搜索(similarity search)是指在大规模数据集中寻找与某个查询对象最相似的对象的过程。该过程通常涉及计算两个对象之间的相似度得分…

软件设计师学习笔记9-进程调度

目录 1. PV操作 1.1进程的同步与互斥 1.1.1互斥 1.1.2同步 1.2 PV操作 1.2.1信号量 1.2.2 PV操作的概念 2.信号量与PV操作 2.1 PV操作与互斥模型 2.2 PV操作与同步模型 2.3 互斥与同步模型结合 3.前趋图与PV操作 1. PV操作 1.1进程的同步与互斥 1.1.1互斥 互斥&…

Car Window Control Reset

大众汽车窗口自动升降失效,重置: 扣住5秒,重启汽车,试一下车钥匙,和再重试这个按钮,扣一下试一试

使用openWRT 配置SFTP 实现远程文件安全传输

文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我们将在OpenWRT上安装SFTP服务,并结合cpolar内网穿透,创建安全隧道映射22端口,实现在公网环境下远程OpenWRT SFTP&#xf…

nginx空字节漏洞复现

将nginx复制到C盘根目录 cmd运行startup.bat 安装完成后访问 输入info.php 输入info.png 抓包使用00截断 可以看到phpinfo成功执行 在PHP的底层C语言里,%00代表着字符串结束,00截断可以用来绕过后端验证,后端验证的时候因为00截断认为文件是…

【已更新代码图表】2023数学建模国赛E题python代码--黄河水沙监测数据分析

E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响,以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位于小浪底水…