写在前面

本文分享了一次面试经历中关于Java反射机制的问题,作者回顾了面试中的表现,并反思了在学习过程中存在的不足,强调了动手实践的重要性。

  不知不觉自己已经工作一年多了,最近愈发的感觉公司的发展路线与自己的个人定位不符合,决定出去找找其他的工作,顺便也检验下自己在业余时间的学习和工作上的积累的一个水平吧。第一场面试自己就明显感觉表现的不太好,首先是自己的知识储备还不够,有些问题答不上来,这个只能靠平时积累和多多学习了,这个按下不提。但是在面试的过程中,好几个自己在事后明显觉得应该能答上来的问题,在面试的时候却一下断了路,比如面试官问我java的反射机制是什么,我回答java的反射机制可以通过类的名字来获取类的对象,进而调用该类的方法、属性等,描述的可能不那么准确,然后面试官让我写一下java反射的实现代码,事后自己想想真的是一个特别基础的问题,自己在拿着笔的时候一下懵了,平时看网上的博客的讲解自己感觉一下就懂了,然后代码也看得懂,到了这种时候才发现,我们以为自己会了很多时候只是在看着别人写的答案的时候觉得自己会了,这些基础的东西当我们看着现成的讲解和代码实现的时候觉得很简单,就觉得自己会了掌握了,其实还差的远呢。所以,今后不管是在学习新的知识,还是复习的时候,一定要多动手,看懂了的要能自己手敲出来,掌握的知识一点要能清晰熟练的讲出个模样来,对着现成的讲解和代码以为自己懂了其实自己只是脑子里过了一下,根本没有将其消化,学技术,不管是多么基础的知识点,自己还是要勤动手,多思考。

转载于:https://www.cnblogs.com/leo-song/p/7788235.html

<think>在Java中,判断一个对象是否为null时,将null前面(如`null == obj`)是一种常见的编程习惯,尤其是在条件语句中。这种法被称为"Yoda条件"(Yoda Condition)或"Yoda表示法"(Yoda Notation)。下面我将详细解释原因,并给出相关示例。 ### 1. 避免空指针异常(NPE)的误Java中,如果使用`obj == null`,有时可能会因为打字错误而成`obj = null`(少打了一个等号)。这会导致将`obj`赋值为`null`,而不是比较操作。而将`null`前面,如`null == obj`,如果误成`null = obj`,编译器会报错,因为不能对`null`赋值。 **示例:** ```java // 正确法 if (obj == null) { ... } // 错误法(少打一个=,变成了赋值) if (obj = null) { ... } // 编译错误:类型不匹配,不能将null赋值给obj // 使用Yoda条件 if (null == obj) { ... } // 错误法:null = obj if (null = obj) { ... } // 编译错误:不能对变量null赋值 ``` **解释:** 在第一种错误法中,`obj = null`是一个赋值表达式,其结果是`null`,而条件语句需要一个布尔值,因此编译器会报错(类型不匹配)。但是,如果`obj`是布尔类型,那么`obj = null`可能不会导致编译错误(但会抛出空指针异常),而`null == obj`的法则完全避免了这种误。 ### 2. 提高代码可读性(有争议) 有些人认为将常量放在前面可以更清晰地表达意图,即我们是在检查某个变量是否为常量值(如`null`)。然而,这种可读性的提升是主观的,有些人可能觉得`obj == null`更自然。 ### 3. 历史原因 这种习惯来源于C/C++语言,因为在C/C++中,赋值操作符(`=`)和相等操作符(`==`)容易混淆,且编译器不会对`if (obj = null)`报错(如果`obj`是指针类型)。因此,将常量放在前面可以避免这种错误。虽然Java中编译器会对`if (obj = null)`报错(除非`obj`是布尔类型),但这一习惯被保留了下来。 ### 4. 在布尔类型变量中的特殊情况 如果`obj`是布尔类型,那么`if (obj = null)`会导致空指针异常,而`if (null = obj)`会直接编译失败。因此,使用Yoda条件可以避免运行时错误。 ### 示例代码 ```java public class NullCheckExample { public static void main(String[] args) { String str = null; // 传统法 if (str == null) { System.out.println("str is null"); } // Yoda条件法 if (null == str) { System.out.println("str is null (Yoda style)"); } // 错误示例(假设str是布尔类型,但这里str是String,所以编译错误) // if (str = null) { // 编译错误: 不兼容的类型: <null>无法转换为boolean // System.out.println("This won't compile"); // } } } ``` ### 结论 将`null`前面主要是为了避免因打字错误而导致的赋值操作,从而在编译阶段就能发现错误。虽然现代IDE通常能检测到这种错误(如提示“可能为误赋值”),但Yoda条件仍是一种防御性编程的习惯。 §§相关问题§§: 1. 在Java中,如何安全地比较两个字符串? 2. 什么是空指针异常(NullPointerException)?如何避免? 3. 在Java中,除了null检查,还有哪些常见的防御性编程技巧? 4. 为什么在布尔类型的条件判断中,使用赋值操作符(=)而不是相等操作符(==)会导致问题?</think>### 判断对象是否为 null 时为什么建议把 null 前面 #### 核心原因:避免空指针异常(NPE)和误赋值错误 在 Java 中,将 `null` 放在比较操作符前面法(如 `null == obj`)被称为 "Yoda 条件"(Yoda Condition),主要出于以下两个关键原因: --- ### 1. 防止误赋值操作符 `=` 导致空指针异常 **问题场景**: ```java // 错误法:少了一个 = 号 if (obj = null) { // 实际是赋值操作,不是比较操作 // 代码逻辑 } ``` **原因分析**: - Java 编译器允许在 `if` 条件中使用赋值操作(`=` 而非 `==`) - 当 `obj` 是包装类型(如 `Integer`)或引用类型时: ```java Integer obj = 123; if (obj = null) { // 编译通过!但运行时抛出 NullPointerException System.out.println("This will never print"); } ``` - 当 `obj` 是基本类型(如 `boolean`)时: ```java boolean flag = true; if (flag = false) { // 编译通过!但逻辑错误(实际是赋值) System.out.println("This will never print"); } ``` **解决方案**: ```java // 正确法:null 在前 if (null = obj) { // 编译器立即报错:不能对 null 赋值 // 语法错误,强制修正 } ``` --- ### 2. 提高代码可读性和一致性 **优势**: 1. **统一检查模式**:当需要连续检查多个对象时保持一致性 ```java if (null == obj1 || null == obj2) { // 统一检查逻辑 } ``` 2. **突出关键值**:将关键常量(`null`)放在前面,强调检查重点 ```java // 更易读:强调 "检查是否为 null" if (null == result.getData()) { // 处理空数据 } ``` 3. **避免方法调用时的空指针**: ```java // 传统法可能抛出 NPE if (obj.toString().equals("test")) {...} // 更安全的法 if ("test".equals(obj.toString())) {...} // 仍然有风险! // 最佳实践:先检查 null if (null != obj && "test".equals(obj.toString())) {...} ``` --- ### 完整代码示例 ```java public class NullCheckExample { public static void main(String[] args) { // 危险的传统法 String dangerous = null; if (dangerous == null) { System.out.println("1. Traditional null check works"); } // 模拟误赋值操作符 boolean flag = true; // if (flag = false) { // 实际是赋值操作,编译通过但逻辑错误 // System.out.println("This should not execute"); // } // 安全的 Yoda 条件法 if (null == dangerous) { System.out.println("2. Yoda condition is safe"); } // 实际应用:安全调用对象方法 processData(dangerous); } private static void processData(String data) { // 安全法:先检查 null if (null != data && !data.isEmpty()) { System.out.println("Processing: " + data); } else { System.out.println("3. Data is null or empty"); } } } ``` **输出**: ``` 1. Traditional null check works 2. Yoda condition is safe 3. Data is null or empty ``` --- ### 行业实践建议 1. **关键代码区域**(如核心业务逻辑): - 强制使用 `null == obj` 法 - 使用静态代码分析工具(如 SonarQube)配置规则检测 2. **现代 IDE 的辅助**: ```java // 在 IntelliJ/Eclipse 中,传统法会收到警告: if (obj = null) { // 警告:'if' 语句中的赋值操作 ``` 3. **团队规范**: - 新项目:推荐统一使用 Yoda 条件 - 老项目:保持现有风格一致性 > **注意**:虽然 `null == obj` 更安全,但 `obj == null` 在 Java 社区中更常见。关键是根据团队规范保持统一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值