jdk8运行jdk7的代码_即使在jdk中也有错误的代码

jdk8运行jdk7的代码

Java 7,TreeSet和NullPointerException。

最近,我尝试用Java 7编译一个用Java 6开发的项目。在执行测试过程中发生了很多有趣的事情,在Java 6中使用Java 7平稳运行的测试失败了! 因此,我必须理解为什么,这就是我发现的内容……首先要了解的上下文:在该项目中,我或多或少有一个简单的Hibernate Entity,如下所示。

package com.marco.test;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import org.hibernate.validator.NotNull;
@Entity
@Table(...)
public class ABean {...private String name;@Column(name = "name", nullable = false)@NotNullpublic String getName() {return name;}public void setName(String name) {this.name = name;}
}

请注意,字段“名称”为nullable = false并标有@NotNull 。 这是为了告诉Hibernate在用户尝试创建或将此列更新为Null的情况下使验证失败。 我也有该实体的比较器。 该比较器使用名称字段来比较Entity(这只是我在项目中的简化版本,当然,我不基于字符串长度订购Bean)

package com.marco.test;
import java.util.Comparator;
public class ABeanComparator implements Comparator<ABean> {@Overridepublic int compare(ABean o1, ABean o2) {if (o1.getName().length() > o2.getName().length()) {return 1;} else if (o1.getName().length() < o2.getName().length()) {return -1;} else {return 0;}}
}

请注意,字段名称没有空检查,在我的项目中,Hibernate已经在处理它。 现在,我有一个测试,该测试创建一个空的Entity并将其存储到TreeSet中,然后执行其他我们在这里并不真正关心的东西。 测试的开始类似于以下代码:

package com.marco.test;
import java.util.SortedSet;
import java.util.TreeSet;
public class SortedTestTest {public static void main(String[] args) {ABean aBean = new ABean();SortedSet<ABean> sortedSet = new TreeSet<ABean>(new ABeanComparator());sortedSet.add(aBean);}
}

如果我使用Java 6运行此程序,一切正常。 但是,对于Java 7,我有一个NullPointerException。

Exception in thread "main" java.lang.NullPointerExceptionat com.marco.test.ABeanComparator.compare(ABeanComparator.java:9)at com.marco.test.ABeanComparator.compare(ABeanComparator.java:1)at java.util.TreeMap.compare(TreeMap.java:1188)at java.util.TreeMap.put(TreeMap.java:531)at java.util.TreeSet.add(TreeSet.java:255)at com.marco.test.SortedTestTest.main(SortedTestTest.java:14)

为什么? 这就是为什么:

public V put(K key, V value) {Entry<K,V> t = root;if (t == null) {compare(key, key); // type (and possibly null) checkroot = new Entry<>(key, value, null);size = 1;modCount++;return null;}

在Java 7中,当第一个Object添加到TreeSet时 (如果(t == null)),将执行与自身的比较(compare(key,key))。 然后,compare方法将调用比较器(如果有的话),并且name属性将具有NullPointerException。

// Little utilities/*** Compares two keys using the correct comparison method for this TreeMap.*/final int compare(Object k1, Object k2) {return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2): comparator.compare((K)k1, (K)k2);}

提出的问题多于答案:

  • 如果您知道TreeSet中的对象是第一个也是唯一的,为什么还要进行比较?
    • 我的猜测是他们想做的是运行一个简单的Null检查。
  • 为什么不创建适当的null检查方法?
    • 没有答案
  • 为什么浪费CPU和内存运行不需要的比较?
    • 没有答案
  • 为什么将一个对象与其自身进行比较(compare(key,key))?
    • 没有答案

这是Java 6中TreeSet的put方法,可以看到比较被注释掉了。

public V put(K key, V value) {Entry<K, V> t = root;if (t == null) {// TBD:// 5045147: (coll) Adding null to an empty TreeSet should// throw NullPointerException//// compare(key, key); // type checkroot = new Entry<K, V>(key, value, null);size = 1;modCount++;return null;}

您看到评论了吗? 向空的TreeSet添加null会引发NullPointerException。 因此,只需检查key是否为null,就不要进行无用的比较! 结论? 始终尝试分析您使用的代码,因为即使在jdk中,也存在错误代码!

参考: 即使在jdk中 ,我们的JCG合作伙伴 Marco Castigliego 也会在“ 删除重复并修复不良名称”博客中提供错误代码 。

翻译自: https://www.javacodegeeks.com/2013/04/even-in-the-jdk-there-is-bad-code.html

jdk8运行jdk7的代码

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

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

相关文章

zen of python什么意思_如何理解「The Zen of Python」?

import thisThe Zen of Python, by Tim PetersPython之禅 &#xff0c;by Tim PetersBeautiful is better than ugly.优美好于丑陋(Python 以优美的代码为其风格&#xff0c;不要写丑陋的代码)Explicit is better than implicit.明了好于隐晦(Python的每一行代码、每一个变量、…

linux用pipe创建的文件类型,linux文件类型之 管道

inux管道管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间&#xff0c;这是它与有名管道的最大区别。有名管道叫namedpipe或者FIFO(先进先出)&#xff0c;可以用函数mkfifo(…

Spring Webflux – Kotlin DSL –实现的演练

在先前的博客文章中&#xff0c;我描述了Spring Web Framework中的响应式编程支持Spring Webflux如何使用基于Kotlin的DSL使用户能够以非常直观的方式描述路由。 在这里&#xff0c;我想探索一些底层实现。 描述一组端点的样本DSL看起来像这样&#xff1a; package sample.ro…

python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)

本篇主页内容&#xff1a;match的基本使用&#xff0c;search的基本使用&#xff0c;findall,finditer的基本使用&#xff0c;匹配中文&#xff0c;贪婪与非贪婪模式Python爬虫教程-19-数据提取-正则表达式(re)正则表达式&#xff1a;一套规则&#xff0c;可以在字符串文本中进…

c语言作业请输入一个运算符,C语言书面作业1(有答案版)..doc

C语言书面作业1(有答案版).书面作业1(数据类型、变量、输入/输出、运算符与表达式、选择结构、循环结构)一、判断题&#xff1a;在正确的说法前面填写T&#xff0c;在错误的说法前面填写F(每题1分)[得分&#xff1a; ]()()()()标识符中可以出现下划线但它不可以放在标识符的开头…

windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...

每当我问到客户&#xff0c;“你用什么存储产品作为文件共享&#xff1f;”经常听到的一个答案(自豪滴)是&#xff0c;“文件共享需要存储么&#xff1f;我们用Windows就可以做到。”Windows就是个百宝箱&#xff0c;什么都能往里装&#xff0c;就像你家冰箱一样。众所周知&…

c语言编写日历作业,c语言实现一个简单日历

满足三个需求:1&#xff0e;输入一个年份&#xff0c;输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。2&#xff0e;输入年月&#xff0c;输出该月的日历。3&#xff0e;输入年月日&#xff0c;输出距今天还有多少天&#xff0c;星期几&#xff0c;是否是公历…

将EntityManager.refresh添加到所有Spring数据存储库

在我以前的文章《从Spring Data JPA访问EntityManager》中&#xff0c;我展示了如何扩展单个Spring Data JPA存储库以访问EntityManager.refresh方法。 这篇文章演示了如何将EntityManager.refresh添加到所有Spring Data Repository。 源代码 第一步是定义您的界面- package …

pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展

土壤营养元素流失、重金属污染是当前全球面临的突出环境问题。生物炭因其具有比表面积较大、吸附性能高和成本低等优点而在环境修复领域日益受到广泛关注&#xff0c;被作为水处理吸附剂、土壤修复改良剂广泛应用于农业土壤改良和环境中重金属的修复和钝化。但通常情况下&#…

Java命令行界面(第26部分):CmdOption

由于Tweet&#xff0c;我了解了本系列中第26个基于Java的功能强大的库&#xff0c;该库用于解析命令行参数 。 CmdOption在其GitHub主页上被描述为“一个通过注释配置的&#xff0c;用于Java 5应用程序的简单注释驱动的命令行解析器工具包。” 该项目的副标题是“命令行解析从未…

vector c++ 赋值_面对拷贝赋值时发生的自我赋值的正确态度时接受而不是防止

C.62: Make copy assignment safe for self-assignmentC.62:保证拷贝赋值对自我赋值安全Reason(原因)If x x changes the value of x, people will be surprised and bad errors will occur (often including leaks).如果xx改变了x的值&#xff0c;人们会觉得很奇怪&#xff0…

c语言字符流缓冲区,深入理解C语言的IO及缓冲操作

http://www.shangxueba.com/jingyan/1837313.html2014与文件I/O围绕文件描述符操作不同&#xff0c;标准I/O的操作是围绕流进行的。流&#xff1a;对于流&#xff0c;《C和指针》里有一段解释得很好&#xff1a;ANSI C进一步对I/O的概念进行了抽象。就C程序而言&#xff0c;所有…

maven插件依赖_当Maven依赖插件位于

maven插件依赖问题&#xff1a; 我们进行了一个集成测试&#xff0c;该测试创建了一个Spring ClassPathXmlApplicationContext &#xff0c;同时这样做导致NoSuchMethodError爆炸。 事实证明&#xff0c;我们对Spring构件的依赖版本存在冲突。 这本身不是一个不寻常的问题-使用…

华为编程规范_华为 Java 编程规范出炉,究竟和官方文档有何不同?

来源&#xff1a;blog.csdn.net/chenleixing/article/details/441739851、引言这个标准是衡量代码本身的缺陷&#xff0c;也是衡量一个研发人员本身的价值。华为作为一家全球化的 IT 公司&#xff0c;十几万员工&#xff0c;无论是人事管理&#xff0c;还是代码管理&#xff0c…

变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在

函数内创建的数组在调用后&#xff0c;是不是就不存在本帖最后由 test_lockxxx 于 2014-04-23 09:31:06 编辑第1种写法&#xff1a;char *getABC(){char str[10];strcpy(str,"12345");return str;}void main(){char *p getABC();printf("%s\n",p); //这…

惯用并发:flatMap()与parallel()– RxJava常见问题解答

简单&#xff0c;有效和安全的并发是RxJava的设计原则之一。 然而&#xff0c;具有讽刺意味的是&#xff0c;它可能是该库中最容易被误解的方面之一。 让我们举一个简单的例子&#xff1a;假设我们有一堆UUID并且对于每个UUID &#xff0c;我们必须执行一组任务。 第一个问题是…

python%20开发工具_20招让你的Python飞起来!

今天分享的这篇文章&#xff0c;文字不多&#xff0c;代码为主。绝对干货&#xff0c;童叟无欺&#xff0c;主要分享了提升 Python 性能的 20 个技巧&#xff0c;教你如何告别慢Python。原文作者 开元&#xff0c;全栈程序员&#xff0c;使用 Python, Java, PHP和C。1. 优化算法…

c语言万能预编译,Objective-C学习笔记

import 指令(将文件的内容在预编译的时候拷贝到写指令的地方)import Foundation 框架NSLog 函数 NSLog("Hello, World!");NSString语法: NSString *str "jack";字符串占位符: %数据类型C 语言支持的数据类型基本数据类型int double float char构造类型数组…

Java命令行界面(第19部分):jClap

本系列中第19篇文章的重点是从Java代码解析命令行参数是jClap &#xff08; Java命令行参数解析器 &#xff09;&#xff0c;不应将它与称为JCLAP的库相混淆&#xff0c;而JCLAP库是我本系列先前文章的重点。 在以前的帖子覆盖JCLAP 1.4加尔斯吉尔温斯坦利&#xff08; snaq.ne…

使用Arquillian和LocalStack脱机测试AWS云堆栈

在AWS云堆栈 &#xff08;例如DynamoDB&#xff0c;S3等&#xff09;上构建应用程序时&#xff0c;需要针对这些组件编写测试。 您可能首先想到的是拥有一个用于生产的环境和一个用于测试的环境&#xff0c;然后针对该环境运行测试。 这对于集成测试&#xff0c;部署测试&…