一、Java基础(2)
本章概要
- 异常的分类及处理
- 异常的概念
- 异常的分类
- 处理异常的方式
- 反射机制
- 动态语言的概念
- 反射机制的概念
- 反射的作用
- Java 的反射 API
- 反射的过程
- 创建对象的两种方式
- Method 的 invoke 方法
1.2 异常的分类及处理
1.2.1 异常的概念
异常指在方法不能按正常方式完成时,可以通过抛出异常的方式退出该方法。在异常中封装了方法执行过程中的错误信息及原因,调用方在获取该异常后可根据业务的情况选择处理该异常或继续抛出该异常。
在方法执行中出现异常时,Java 异常处理机制会将代码的执行权交给异常处理器,异常处理器根据在系统中定义的异常处理规则执行不同的异常处理逻辑(抛出异常或捕捉并处理异常)。
1.2.2 异常的分类
在 Java 中,Throwable 是所有错误或异常的父类,Throwable 又可分为 Error 和 Exception,常见的 Error 有 AWTError、ThreadDeath,Exception 又可分为 RuntimeException(运行时异常)和 CheckedException(检查异常),如下:

Error 指 Java 程序运行错误。如果程序在启动时出现 Error,则启动失败;如果程序在运行过程中出现 Error,则系统将退出进程。出现 Error 通常是因为系统的内部错误或资源耗尽,Error 不能在运行过程中被动态处理。如果程序出现 Error,则系统能做的工作也只能是记录错误的成因和安全终止。
Exception 指 Java 程序运行异常,即运行中的程序发生了人们不期望发生的事件,可以被 Java 异常处理机制处理。Exception 也是程序开发中异常处理的核心,如图:

- RuntimeException:指在 Java 虚拟机正常运行期间抛出的异常。RuntimeException 可被捕获并处理,如果出现 RuntimeException,那么一定是程序发生错误导致的。我们通常需要抛出该异常或捕获并处理该异常。常见的 RuntimeException 有 NullPointerException、ClassCastException、ArrayIndexOutOfBundsException 等。
- CheckedException:Java 编译器在编译阶段会检查 CheckedException 异常并强制程序捕获和处理此类异常,即要求程序在可能出现异常的地方通过 try catch 语句块捕获并处理异常。常见的 CheckedException 有由于 I/O 错误导致的 IOExceptioin、SQLException、ClassNotFoundException 等。该异常一般由于打开错误的文件、SQL 语法错误、类不存在等引起。
1.2.3 处理异常的方式
处理异常有抛出异常和使用 try catch 语句块捕获并处理异常这两种方式。
(1)抛出异常:指遇到异常时不进行具体处理,而是将异常抛给调用者,由调用者根据情况处理。有可能是直接捕获并处理,也有可能是继续向上层抛出异常。抛出异常有三种方式:throws、throw、系统自动抛出异常。其中,throws 作用在方法上,用于定义方法可能抛出的异常;throw 作用在方法内,表示明确抛出一个异常。
throw 和 throws 的具体区别如下:
- 位置不同:throws 作用在方法上,和面跟着的是异常的类;而 throw 作用在方法内,后面跟着的是异常的对象。
- 功能不同:throws 用于声明方法在运行过程中可能出现的异常,以便调用者根据不同的异常类型预先定义不同的处理方式;throw 用于抛出封装了异常信息的对象,程序在执行到 throw 时后续的代码将不再执行,而是跳转到调用者,并将异常信息抛给调用者。也就是说,throw 后面的语句将无法被执行(finally 语句块除外)。
(2)使用 try catch 语句块捕获并处理异常:使用 try catch 语句块捕获异常能够有针对地处理每种可能出现的异常,并在捕捉到异常后根据不同的情况做不同的处理。
相关面试题:
- Java 中的异常处理方式(机制)有哪些?★★★☆☆
- Error 和 Exception 的区别是什么?★★☆☆☆
- throw 和 throws 的具体区别是什么?★☆☆☆☆
1.3 反射机制
Java 的反射机制可以动态获取类和对象的信息,以及动态调用对象的方法,被广泛应用于动态代理的场景中。
1.3.1 动态语言的概念
动态语言指程序在运行时可以改变其结构的语言,比如新的属性或方法的添加、删除等结构上的变化。JavaScript 、Ruby 、 Python 等都属于动态语言;C、C++ 不属于动态语言。从反射的角度来说,Java 属于半动态语言。
1.3.2 反射机制的概念
反射机制指在程序运行过程中,对任意一个类都能获取其所有属性和方法,并且对任意对象都能调用其任意方法。这种动态获取类和对象的信息,以及动态调用对象的方法的功能被称为 Java 的反射机制。
1.3.3 反射的作用
Java 中的对象有两种类型:编译时类型和运行时类型。编译时类型指在声明对象时采用的类型,运行时类型指为对象赋值时所采用的的类型。
在如下代码中,persion 对象的编译时类型为 Persion ,运行时类型为 Student ,因此无法在编译时获取在 Student 类中定义的方法:
Persion persion = new Student();
因此,程序在编译期间无法预知该对象和类的真实信息,只能通过运行时信息来发现该对象和类的真实信息,而其真实信息(对象的属性和方法)通常通过反射机制来获取,这便是 Java 中反射机制的核心功能。
1.3.4 Java 的反射 API
Java 的反射 API 主要用于在运行过程中动态生成类、接口或对象等信息,其常用 API 如下:
- Class 类:用于获取类的属性、方法等信息
- Field 类:表示类的成员变量,用于获取和设置类中的属性值
- Method 类:表示类的方法,用于获取方法的描述信息或执行某个方法
- Constructor 类:表示类的构造方法
1.3.5 反射的过程
反射的步骤如下:
- 获取想要操作的类的 Class 对象,该 Class 对象时反射的核心,通过它可以调用类的任意方法。
- 调用 Class 对象所对应的类中定义的方法,这是反射的使用阶段
- 使用反射 API 类来获取并调用类的属性和方法等信息。
获取 Class 对象的 3 种方式如下:
- 调用某个对象的 getClass 方法以获取该类对应的 Class 对象:
Persion p = new Persion();
Class clazz = p.getClass();
- 调用某个类的 class 属性以获取该类对应的 Class 对象:
Class clazz = Persion.class;
- 调用 Class 类中的 forName 静态方法以获取该类对应的 Class 对象,这是最安全、性能也最好的方式:
Class clazz = Class.forName("fullClassPath"); // fullClassPath 为类的包路径及名称
我们在获得想要操作类的 Class 对象后,可以通过 Class 类中的方法获取并查看该类中的方法和属性,具体的实例代码如下:
// 1.获取 Persion 类的 Class 对象
Class clazz = Class.forName("hello.java.reflect.Persion");
// 2.获取Persion 类的所有方法的信息
Method[] method = clazz.getDeclaredMethods();
for(Method m : method){System.out.println(m.toString);
}
// 3.获取 Persion 类的所有成员的属性信息
Field[] field = clazz.getDeclaredFields();
for(Field f : field){System.out.println(f.toString);
}
// 4.获取 Persion 类的所有构造方法的信息
Constructor[] constructor = clazz.getDeclaredConstructors();
for (Constructor c : constructor){System.out.println(c.toString);
}
1.3.6 创建对象的两种方式
创建对象的两种方式如下:
- 使用 Class 对象的 newInstance 方法创建该 Class 对象对应类的实例,这种方式要求该 Class 对象对应的类有默认的空构造器。
- 先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance 方法创建 Class 对象对应类的实例,通过这种方式可以选定构造方法创建实例。
创建对象的具体代码如下:
//1.1:获取 Persion 类的 Class 对象
Class clazz = Class.forName("hello.java.reflect.Persion");
//1.2:使用 newInstance 方法创建对象
Persion p = (Persion) clazz.newInstance();
//2.1:获取构造方法并创建对象
Constructor c = clazz.getDeclaredConstructor(String.class,String.class,int.class);
//2.2:根据构造方法创建对象并设置属性
Persion p1 = (Persion) c.newInstance("李四","男","20");
1.3.7 Method 的 invoke 方法
Method 提供了关于类或接口上某个方法及如何访问该方法的信息,那么在运行代码中如何动态调用该方法呢?答案是通过调用 Method 的 invoke 方法实现。通过 invoke 方法可以实现动态调用,比如可以动态传入参数并将方法参数化。具体过程:获取 Method 对象,并调用 Method 的invoke 方法,如下所述:
- 获取 Method 对象:通过调用 Class 对象的 getMethod(String name,Class<?> … parameterTypes) 返回一个 Method 对象,它描述了此 Class 对象所表示的类或接口指定的公共成员方法。name 参数是 String 类型,用于指定所需方法的名称。parameterTypes 参数是按声明顺序标识该方法的形参类型的 Class 对象的一个数组,如果 parameterTypes 为 null,则按空数组处理。
- 调用 Method 的 invoke 方法:通过调用 Method 对象的 invoke 方法来动态执行函数。invoke 方法的具体使用代码如下:
//1.获取 Persion 类(hello.java.reflect.Persion)的 Class 对象
Class clz = Class.forName("hello.java.reflect.Persion");
//2.获取 Class 对象中的 setName 方法
Method method = clz.getMethod("setName", String.class);
//3.获取 Constructor 对象
Constructor constructor = clz.getConstructor();
//4.根据 Constructor 定义对象
Object object = constructor.newInstance();
//5.调用 Method 的 invoke 方法,这里的 Method 表示 setName 方法
//因此,相当于动态调用 object 对象的 setName 方法并传入 alex 参数
method.invoke(object,"alex");
以上代码首先通过 Class.forName 方法获取 Persion 类的 Class 对象,然后调用 Persion 类的 Class 对象的 getMethod(“setName”,String.class) 获取一个 Method 对象;接着使用 Class 对象获取指定的 Constructor 对象并调用 Constructor 对象的 newInstance 方法创建 Class 对象对应类的实体;最后调用 method.invoke 方法实现动态调用,这样就通过反射动态生成类的对象并调用其方法。
相关面试题:
- Java 反射机制的作用是什么?★★★☆☆
- Java 反射机制创建对象的方式有哪些?★★☆☆☆
- Java 是如何实现动态调用某个方法的?★☆☆☆☆
- 通过 Java 反射创建对象和通过 new 创建对象,哪个效率更高?★☆☆☆☆
- 除了可以使用 new 方法创建对象,还可以使用什么方法创建对象?★☆☆☆☆
相关文章:
一、Java基础(2)
本章概要 异常的分类及处理 异常的概念异常的分类处理异常的方式 反射机制 动态语言的概念反射机制的概念反射的作用Java 的反射 API反射的过程创建对象的两种方式Method 的 invoke 方法 1.2 异常的分类及处理 1.2.1 异常的概念 异常指在方法不能按正常方式完成时…...
软件设计师重要知识点——第一章——计算机组成与体系结构
目录 1.1数据的表示 1.2数值表示范围 1.3浮点的运算 1.4计算机结构 1.5计算机体系结构分类——Flynn 1.6指令的基本概念 1.7寻址方式 1.8CISC与RISC 1.9流水线 1.10层次化存储结构 1.11Cache 1.12主存——编址与计算 1.13总线 1.14串联系统与并联系统 1.15N模混…...
编程学习心得
我来写一些,我关于编程的简单认识吧。 我觉得编程是一门艺术,也是一项技能,需要不断地学习和练习。无论是初学者还是有经验的开发人员,都需要耐心和恒心,才能够成为一名优秀的程序员。以下是一些关于编程学习的心得和…...
web获取媒体流
1. 下面例子演示了录屏和截图功能: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…...
代码随想录算法训练营第四十二天 | 01背包问题,你该了解这些、01背包问题,你该了解这些 滚动数组、 416. 分割等和子集
打卡第42天,搞搞01背包。 今日任务 01背包问题,你该了解这些!01背包问题,你该了解这些! 滚动数组416.分割等和子集 背包问题1.0 :0-1 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weig…...
【Android】JNI静态与动态注册介绍
JNI的两种注册机制:静态注册和动态注册. 一、JNI介绍 JNI(Java Native Interface),即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C机型交互. 方式: 静态注册动态注册:需要提供Java中…...
【算法题解】22. 接雨水
这是一道 困难 题 题目来自: https://leetcode.cn/problems/trapping-rain-water/ 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,…...
集合详解之(四)集合的遍历
文章目录🐒个人主页🏅JavaSE系列专栏📖前言:🎀ArrayList集合forEach()方法遍历🎀for循环遍历(针对List集合)🪅增强for循环(也支持Set集合)&#x…...
【I2C】通用驱动i2c-dev分析
文章目录1. 前言2. i2c-dev驱动的注册过程3. open_i2c_dev函数分析4. set_slave_addr函数分析5. i2c_read_bytes函数分析1. 前言 前面分析i2c-tool测试工具就是基于drivers/i2c/i2c-dev.c驱动来实现的。i2c-dev驱动在加载时会遍历所有的I2C总线(i2c_bus_type)上所有注册的adap…...
用GPT-4写代码不用翻墙了?Cursor告诉你:可以~~
目录 一、介绍 二、使用方法 三、其他实例 1.正则表达式 2.自动化测试脚本 3.聊聊技术 一、介绍 Cursor主要功能是根据用户的描述写代码或者进行对话,对话的范围仅限技术方面。优点是不用翻墙、不需要账号。Cursor基于GPT模型,具体什么版本不祥&#…...
硬件语言Verilog HDL牛客刷题day03 时序逻辑部分
1.VL21 根据状态转移表实现时序电路 1.题目: 某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。 2.解题思路 2.1 首先同步时序电路 , 时钟上升沿触发, 复位信号rst 低电…...
day31 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和
● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和 在本次的题目中,我们使用了贪心算法来解决三个问题:分发饼干、摆动序列、最大子序和。这三个问题都可以使用贪心算法来解决,而且贪心算法的时间复杂度相对较低,能够在较短的…...
MobTech 秒验|本机号码一键登录会泄露隐私吗
本机号码一键登录是一种新型的应用登录方式,它可以利用运营商的数据网关认证能力,实现手机号免密登录,提高用户体验和转化率,降低验证成本和流失率。本机号码一键登录支持三大运营商号码认证,3秒内完成手机号验证&…...
2023年供销合作社研究报告
第一章 行业概况 1.1 供销合作社概述 中华全国供销合作总社,是中华人民共和国全国供销合作社的联合组织。中华全国供销合作总社的前身可以追溯到1949年11月成立的中央合作事业管理局。在新中国成立初期,供销合作社就基本形成了自上而下、覆盖全国的组织…...
【ansible】实施任务控制
目录 实施任务控制 一,循环(迭代)--- loop 1,利用loop----item循环迭代任务 2,item---loop循环案例 1,定义item循环列表 2,通过变量应用列表格式 3,字典列表(迭代嵌套子…...
49天精通Java,第11天,java接口和抽象类的异同,default关键字
目录一、什么是接口二、接口的特点三、接口和类的区别四、接口和抽象类的区别五、接口的声明方式六、default默认方法大家好,我是哪吒。 一、什么是接口 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的…...
JAVA练习99-逆波兰表达式求值
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-逆波兰表达式求值 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 4月5…...
恶意软件、恶意软件反杀技术以及反病毒技术的详细介绍
1.恶意软件简单介绍恶意软件是指在计算机系统上执行恶意任务的病毒、蠕虫和特洛伊木马的程序,通过破坏软件进程来实施控制。腾讯移动安全实验室发布的数据显示,恶意软件由多种威胁组成,会不断弹出,所以需要采取多种方法和技术来进…...
【数据库运维】mysql备份恢复练习
目录 数据库备份,数据库为school,素材如下 1.创建student和score表 2.为student表和score表增加记录 3.备份数据库school到/backup目录 4.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库 5.直接将My…...
刷题30-对称的二叉树
对称的二叉树 思路:用递归,首先明白递归中止的条件是什么 搬用别人的看法: 做递归思考三步: 1.递归的函数要干什么? 函数的作用是判断传入的两个树是否镜像。 输入:TreeNode left, TreeNode right 输出…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
