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

java面试题-泛型异常反射

泛型

1.什么是泛型?

Java是一种强类型语言,数据类型在编译时必须确定。如果我们想要在代码中使用不同类型的数据,那么就需要为每种类型分别写出相应的代码。这样会导致代码冗长、重复,也不便于维护。为了解决这个问题,Java引入了泛型机制,允许在类、接口、方法中使用类型参数,使代码更加通用、简洁、安全。

示例代码:

// 不使用泛型
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // 需要强制类型转换,容易出现类型转换异常// 使用泛型
List<String> list = new ArrayList<String>();
list.add("hello");
String str = list.get(0); // 不需要强制类型转换,类型安全

2.泛型类如何定义使用?

泛型类定义的语法格式如下:

public class 类名<类型参数列表> {// 成员变量、方法等
}

其中,类型参数列表是用尖括号包围起来的一组类型参数,可以有多个,用逗号隔开。类型参数可以在类中的任何位置使用。泛型类的实例化时需要指定类型实参。

示例代码:

public class ClassName<T> {private T value;public ClassName(T value) {this.value = value;}public T getValue() {return value;}
}ClassName<Integer> obj = new ClassName<Integer>(123);
int value = obj.getValue();

3.泛型接口如何定义使用?

泛型接口定义的语法格式如下:

public interface 接口名<类型参数列表> {// 方法声明
}

其中,类型参数列表和泛型类的类型参数列表语法相同,可以在接口中的任何位置使用。泛型接口的实现类需要指定类型实参。

public interface InterfaceName<T> {void doSomething(T parameter);
}InterfaceName<String> obj = new InterfaceName<String>() {public void doSomething(String parameter) {System.out.println(parameter);}
};
obj.doSomething("hello");

4.泛型方法如何定义使用?

泛型方法定义的语法格式如下:

修饰符 <类型参数列表> 返回值类型 方法名(形参列表) {// 方法体
}

其中,类型参数列表和泛型类、泛型接口的类型参数列表语法相同,可以在方法中的任何位置使用。在方法调用时,可以显式指定类型实参,也可以通过参数类型推断省略类型实参。

public class ClassName {public <T> void methodName(T parameter) {System.out.println(parameter);}
}ClassName obj = new ClassName();
obj.<String>methodName("hello");

5.泛型的上限和下限?

泛型的上限和下限是限制类型参数的边界。泛型的上限使用 extends 关键字,表示类型参数必须是指定的类型或其子类。泛型的下限使用 super 关键字,表示类型参数必须是指定的类型或其超类。

// 上限
public class ClassName {public <T extends Number> void methodName(T parameter) {System.out.println(parameter);}
}ClassName obj = new ClassName();
obj.methodName(123); // OK
obj.methodName("hello"); // 编译错误,String不是Number的子类// 下限
public void methodName(List<? super Integer> parameter) {parameter.add(123);parameter.add(3.14); // 编译错误,3.14是double类型
}List<Number> list1 = new ArrayList<Number>();
methodName(list1); // OK
List<Object> list2 = new ArrayList<Object>();
methodName(list2); // 编译错误,Object不是Integer或Integer的超类

6.如何理解Java中的泛型是伪泛型?

Java中的泛型是通过类型擦除实现的,即在编译时擦除类型信息,在运行时不保留类型信息。因此,在运行时无法获得泛型类型参数的具体类型。这样,Java中的泛型就成了一种“伪泛型”。泛型类型信息在编译时可以检查,但在运行时被擦除,这是泛型机制的一个局限性,但也是Java泛型的一个优点,因为这种方式避免了运行时的类型转换错误,并提高了运行时的性能。

另外,Java中的泛型还存在一个“类型擦除”问题。在使用泛型时,类型参数实际上被转换成了其边界类型或 Object 类型。这就导致了一些限制,比如无法创建泛型数组,无法在泛型类型中使用基本类型等。虽然Java中的泛型有一些限制,但仍然是一种非常有用的机制,可以使代码更加通用、简洁、安全。

public class ClassName<T> {private T value;public ClassName(T value) {this.value = value;}public T getValue() {return value;}
}ClassName<Integer> obj1 = new ClassName<Integer>(123);
ClassName<String> obj2 = new ClassName<String>("hello");System.out.println(obj1.getClass().getName()); // ClassName
System.out.println(obj2.getClass().getName()); // ClassName// 泛型类型信息在运行时被擦除

异常

1.Java异常类层次结构?

Java异常类层次结构是异常处理的基础,如下所示:

java.lang.Object|+--java.lang.Throwable|+--java.lang.Error|+--java.lang.Exception|+--java.io.IOException|+--java.sql.SQLException|+--其他异常类

所有的异常类都继承自 Throwable 类。Throwable 类有两个直接子类:Error 和 Exception。Error 表示系统级别的错误和资源耗尽等无法恢复的错误,程序通常无法处理。例如,OutOfMemoryError 表示内存不足错误。Exception 是程序中可能会遇到的异常情况,程序可以通过捕获和处理这些异常来恢复正常运行。Exception 又分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。可查的异常是指在编译时必须进行处理的异常,这些异常必须被捕获或声明抛出。不可查的异常是指在编译时无法确定是否需要处理的异常,这些异常不需要被捕获或声明抛出。

2.可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)区别?

可查的异常必须在编译时进行处理,否则编译器会报错。这些异常通常是由系统或程序逻辑错误引起的,例如文件不存在、输入输出错误等。常见的可查异常包括 IOException、SQLException 等。

不可查的异常通常是由程序设计错误引起的,例如空指针异常、类型转换异常等。这些异常通常发生在运行时,编译器无法检测到。不可查的异常不需要在方法签名中声明抛出,并且不需要在调用时进行处理。

3.throw和throws的区别?

throw 和 throws 关键字都用于处理异常,但含义不同。throw 关键字用于抛出一个异常对象。在方法中,当程序发现异常情况时,可以使用 throw 关键字抛出一个异常对象。例如:

if (x == null) {throw new NullPointerException("x is null");
}

throws 关键字用于在方法签名中声明可能抛出的异常。在方法中,如果可能会抛出一个异常,但是不想在方法内部进行处理,可以在方法签名中使用 throws 关键字声明可能抛出的异常。例如:

public void foo() throws Exception {// 方法体
}

4.Java 7 的 try-with-resources?

Java 7 引入了 try-with-resources 语句,这是一种简化关闭资源代码的方法。在 try-with-resources 语句中,可以自动关闭实现了 java.lang.AutoCloseable 接口的资源,例如文件或数据库连接等。

以下是一个使用 try-with-resources 语句的简单示例:

public class Demo {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {String line = reader.readLine();while (line != null) {System.out.println(line);line = reader.readLine();}} catch (IOException e) {e.printStackTrace();}}
}

在上面的示例中,BufferedReaderFileReader 都实现了 AutoCloseable 接口。在 try-with-resources 语句中,我们创建一个 BufferedReader 对象和一个 FileReader 对象,并将它们作为资源传递给 try 语句。当程序离开 try 块时,JVM 会自动关闭这两个资源。

try-with-resources 语句可以有多个资源,例如:

try (Resource1 res1 = new Resource1(); Resource2 res2 = new Resource2()) {// ...
}

在这种情况下,两个资源都会被自动关闭。如果资源之间有依赖关系,可以按照需要在 try-with-resources 语句中创建和关闭资源。

5.Java 异常的底层实现,以及Exception Table是什么?

Java 异常的底层实现涉及到 Java 虚拟机(JVM)中的 Exception Table。在 Java 代码编译成字节码时,编译器会将所有可能抛出异常的代码块标记为异常处理器。这些异常处理器被编译器放在 Exception Table 中,并包含了异常处理器的入口地址、代码块的起始和结束位置、以及异常类型等信息。

当程序执行到可能抛出异常的代码块时,JVM 会检查 Exception Table 中是否存在与当前抛出的异常匹配的异常处理器。如果存在,则将程序控制流转移到对应的异常处理器,执行异常处理器中的代码。如果不存在匹配的异常处理器,则将异常抛出到调用栈上层的异常处理器或者 JVM 运行时系统中进行处理。

下面是一个简单的示例,用于演示 Exception Table 的实现:

public class Demo {public static void main(String[] args) {int result = divide(10, 0);System.out.println("Result: " + result);}public static int divide(int a, int b) {int result = 0;try {result = a / b;} catch (ArithmeticException e) {System.out.println("Exception caught: " + e.getMessage());}return result;}
}

在上面的示例中,divide() 方法计算两个整数的商。如果除数为 0,则会抛出一个 ArithmeticException 异常。在 main() 方法中,调用 divide() 方法计算结果,并打印计算结果。

当执行到 result = a / b 语句时,JVM 会检查 Exception Table 中是否存在匹配 ArithmeticException 异常的异常处理器。在这个示例中,存在一个匹配的异常处理器,它位于 catch (ArithmeticException e) 代码块中。JVM 将程序控制流转移到异常处理器中,并执行其中的代码,打印异常信息。然后,JVM 将程序控制流返回到调用 divide() 方法的地方,继续执行程序。


反射

  1. 什么是反射?

反射是一种在运行时动态地获取类的信息和调用类的方法的能力。Java 反射 API 可以让程序在运行时动态地创建对象、访问对象属性、调用对象方法以及获取对象信息等,从而增强了程序的灵活性和可扩展性。

2.反射的使用?

反射可以用来实现一些高级的特性,比如依赖注入、框架配置和代理等。反射 API 主要提供了以下几个类来实现反射功能:

  • Class 类:表示一个类的类型,可以用来获取类的信息、实例化对象、访问类的静态成员和调用类的方法等。

  • Field 类:表示一个类的字段,可以用来访问和修改对象的属性。

  • Method 类:表示一个类的方法,可以用来调用对象的方法。

  • Constructor 类:表示一个类的构造函数,可以用来实例化对象。

下面是一个简单的示例,用于演示反射的使用:

public class Demo {private String message;public Demo(String message) {this.message = message;}public String getMessage() {return message;}
}public class Main {public static void main(String[] args) throws Exception {Class<?> cls = Class.forName("Demo");Constructor<?> constructor = cls.getConstructor(String.class);Object obj = constructor.newInstance("Hello, world!");Method method = cls.getMethod("getMessage");String message = (String) method.invoke(obj);System.out.println(message);}
}

在上面的示例中,Demo 类有一个带有一个参数的构造函数和一个返回 message 属性值的 getMessage() 方法。在 Main 类中,使用 Class.forName() 方法获取 Demo 类的类型,然后使用 getConstructor() 方法获取 Demo 类的带有一个字符串参数的构造函数。接着,使用 newInstance() 方法创建一个 Demo 类的实例。最后,使用 getMethod() 方法获取 Demo 类的 getMessage() 方法,然后使用 invoke() 方法调用该方法,并将返回值强制转换为字符串类型。

3.getName、getCanonicalName与getSimpleName的区别?

这三个方法都是在 Class 类中定义的,可以用来获取一个类的名称或规范化名称。在很多情况下,它们的返回值是相同的。但是,在一些特殊情况下,它们的返回值可能会有所不同。

  • getName() 方法返回的是一个类的全限定名,包括包名和类名,例如 "java.lang.String"

  • getCanonicalName() 方法返回的是该类的规范化名称,也就是在所有类型名称上执行一系列规则后的名称,例如 "java.lang.String"

  • getSimpleName() 方法返回的是该类的简单名称,也就是不包括包名的类名,例如 "String"

相关文章:

java面试题-泛型异常反射

泛型1.什么是泛型&#xff1f;Java是一种强类型语言&#xff0c;数据类型在编译时必须确定。如果我们想要在代码中使用不同类型的数据&#xff0c;那么就需要为每种类型分别写出相应的代码。这样会导致代码冗长、重复&#xff0c;也不便于维护。为了解决这个问题&#xff0c;Ja…...

详细解读ChatGPT:如何调用ChatGPT的API接口到官方例子的说明以及GitHub上的源码应用和csdn集成的ChatGPT

文章目录1. 解读ChatGPT1.1 词语解释1.2 功能解读2. GitHub上ChatGPT的应用源码3. 调用ChatGPT的API4. 官方例子说明5. 集成ChatGPT自ChatGPT出来到如今&#xff0c;始终走在火热的道路上&#xff0c;如今日活用户破亿&#xff0c;他为何有如此大的魅力&#xff0c;深受广大用户…...

九龙证券|最新评级情况出炉,机构扎堆这一板块!聚氨酯龙头获得最多关注

本周算计254家上市公司获组织“买入型”评级。 电子板块评级组织扎堆 证券时报数据宝计算&#xff0c;2月13日至17日&#xff0c;A股市场53家组织算计进行347次评级&#xff0c;254家上市公司获“买入型”评级&#xff08;包含买入、增持、强烈推荐、推荐&#xff09;。 从申…...

考研复试机试 | C++ | 尽量不要用python,很多学校不支持

目录1.1打印日期 &#xff08;清华大学上机题&#xff09;题目&#xff1a;代码&#xff1a;1.2改一改&#xff1a;上一题反过来问题代码&#xff1a;2.Day of Week &#xff08;上交&&清华机试题&#xff09;题目&#xff1a;代码&#xff1a;3.剩下的树&#xff08;清…...

ChatGPT时代,别再折腾孩子了

今天这篇完全是从两件事儿有感而发。昨天在文印店&#xff0c;在复印机上看到装订好的几页纸&#xff0c;我瞥了一眼&#xff0c;是历史知识点&#xff1a;隋朝大运河分为四段&#xff0c;分别是___ ___ ___ ___&#xff0c;连接了五大河___ ___ ___ ___ ______ 年&#xff…...

万字干货 | 荔枝魔方基于云原生的架构设计与实践

近年来&#xff0c;荔枝集团在国内和海外的业务迅速发展&#xff0c;业务数据规模也是成几何式地增长&#xff0c;海量数据的计算分析场景、业务智能算法应用需求随之而生&#xff0c;为了快速地满足业务发展的需要&#xff0c;我们面临着诸多的技术挑战。技术挑战工程问题资源…...

#科研筑基# python初学自用笔记 第九篇 面向对象编程

面向对象编程 Object Oriented Programming &#xff0c;简称OOP&#xff0c;是一种程序设计思想&#xff0c;这种思想把对象作为程序的基本单元。类是抽象的&#xff0c;对象是具体的&#xff0c;一种类包括其特定的数据或属性&#xff0c;以及操作数据的函数&#xff08;方法…...

Python快速上手系列--邮件发送--详解篇

本章就来一起学习一下跑完自动化脚本后如何自动的发送邮件到指定的邮箱。zmail操作&#xff1a;1. 导包 import zmail2. 邮件内容&#xff0c;包含&#xff1a;主题(subject)、正文(content_text)、附件(attachments)3. 发件人信息&#xff0c;包含&#xff1a;发件人账号&…...

【Bluetooth开发】蓝牙开发入门

BLE 蓝牙设备在生活中无处不在&#xff0c;但是我们也只是将其作为蓝牙模块进行使用&#xff0c;发送简单的AT命令实现数据收发。 那么&#xff0c;像对于一些复杂的使用场合&#xff1a;“车载蓝牙”、"智能手表"、“蓝牙音箱”等&#xff0c;我们不得不去了解底层…...

07:进阶篇 - 在程序中嵌入 CTK Plugin Framework

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 如果已经创建了一个应用程序,现在要将 CTK Plugin Framework 嵌入其中,该如何进行呢? 下面,以《06:进阶篇 - Hello,CTK!》中的插件为例,来演示如何使用 CTK Plugin Framework 来加载插件并获取特定…...

快速低成本动画视频课

快速低成本动画视频课Character Animator能做什么如何用character animator制作动画视频Animate能做什么Adobe Animate和Character Animator结合&#xff0c;如何快速制作低成本动画视频课Character Animator能做什么 Character Animator是Adobe公司的一个动画制作软件&#x…...

大数据平台测试-软件测试常见面试回答(持续更新)

面试造航母&#xff0c;入职拧螺丝。面试&#xff0c;讲点面试官想听的。。。 1、你有过漏测的经历吗&#xff1f; 答&#xff1a;这道题肯定是回答有。然后展开描述。就类似面试官问 你印象比较深的一个bug。。。 测试无穷尽&#xff0c;质量也并非测试一个岗位的责任&…...

链表学习之反转链表

链表解题技巧 额外的数据结构&#xff08;哈希表&#xff09;&#xff1b;快慢指针&#xff1b;虚拟头节点&#xff1b; 反转链表 分别实现单向链表和双向链表的反转。 要求&#xff1a;长度为N的链表&#xff0c;时间复杂度为O(N)&#xff0c;额外空间复杂度为O(1)。 反转…...

ONNXRUNTUIME实例分割网络说明

ONNXRUNTUIME c使用&#xff08;分割网络&#xff09;与相关资料&#xff08;暂记&#xff09; initiate a env with an id name(使用id名称启动env) create session (创建会话 ) onnxenv -> sessioninputname [“x”] ,outputname [“t”]inputnodedim [[1,1,192,192…...

几行代码,就写完懒加载啦?

Ⅰ、前言 「懒加载」是网页中非常 常见的&#xff1b;为了减少系统的压力&#xff0c;对于一些电商系统出场频率非常高&#xff1b;那么大家一般用什么方式去实现 「懒加载」 呢 &#xff1f; ① 通过 scroll 的形式&#xff1a; 通过 滚动「scroll」事件&#xff0c;然后去判…...

PyTorch常用的损失函数(ChatGPT)

L1Loss nn.L1Loss 也称为平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;。它计算预测值与真实值之间的差异&#xff08;即误差&#xff09;&#xff0c;然后取绝对值并求和&#xff0c;最后除以样本数量得到平均误差。具体来说&#xff0c;对于一批…...

LeetCode——1237. 找出给定方程的正整数解

一、题目 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/description/ 翻译一下题目 意思是&#xff0c;这是一个二维单调递增的函数&#xff0c;函数一共有 9 …...

系统编程中的进程的概念No.3【进程状态】

引言&#xff1a; 北京时间&#xff1a;2023/2/17/8:17&#xff0c;目前听着超能陆战队主题曲《Immortals》&#xff0c;感觉又要螺旋式升天&#xff0c;并且为我今天上午没课感到happy&#xff0c;所以继我们很久以前的关于进程的博客&#xff0c;今天我们就再来学习一下有关…...

推荐 3 款 Golang 语义化版本库

文章目录1.什么是语义化版本 2.0.02.Golang 语义化版本库比较3.小结参考文献1.什么是语义化版本 2.0.0 语义化版本 2.0.0&#xff08;Semantic Versioning 2.0.0&#xff09;是一种用于标识软件版本的约定和规范。它包含三个数字组成的版本号&#xff0c;格式为“MAJOR.MINOR.…...

Windows平台使用gdb连接qemu虚拟机上的系统

先安装MinGW&#xff1b; 除了gcc、g&#xff0c;把gdb也选上&#xff1b;可能选第一个就可以了&#xff0c;不清楚把后面几个也选上&#xff1b; 安装完成看一下gcc, g&#xff0c;gdb&#xff0c;编译工具和调试器都有了&#xff1b; 把bin目录加到环境变量&#xff1b; 看一…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...