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的代码

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

  1. 即使在jdk中也有错误的代码

    Java 7,TreeSet和NullPointerException. 最近,我尝试用Java 7编译一个用Java 6开发的项目.在执行测试过程中发生了很多有趣的事情,在Java 6中使用Java ...

  2. amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境

    今天给大家分享一下如何配置java的JDK环境.操作步骤如下: 1.下载好 jdk 的安装文件,我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件: 2.使用 ...

  3. react入门代码_如何在React中构建温度控制应用程序-包括提示和入门代码

    react入门代码 我们正在建立的 (What we're building) In this beginner React project, we're going to learn how to ...

  4. java cxf服务端代码_【JAVA】 cxf 生成 webservice 服务端代码

    CXF Apache CXF = Celtix + XFire.CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding . ...

  5. java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势

    java 编写代码 2016年最有趣的Java相关主题 关于代码,有很多热门话题,而要跟上所有事情,这是一项全职的工作. 如果您想知道如何从谷壳中分离出小麦,我们已经为您完成了工作. 在下面的文章中, ...

  6. python快速接手别人的代码_十步教你如何接手别人的代码!

    想必在很多程序员的职业生涯中,都有过一种难以避免的状况,即接下别人的代码.而这是种怎样的体验?有人说,接手别人的代码之后我也想辞职:有人说,一个连注释都没有的代码有何灵魂可言:更有网友说,如果你恨一个 ...

  7. python武器代码_程序员需要掌握的七种 Python 代码更易维护的武器

    检查你的代码风格 PEP 8 是 Python 代码风格规范,它规定了类似行长度.缩进.多行表达式.变量命名约定等内容.尽管你的团队自身可能也会有稍微不同于 PEP 8 的代码风格规范,但任何代码风格 ...

  8. qml延迟代码_选择C而不是QML将您的代码减少80

    qml延迟代码 Many tools rely on web technologies like JavaScript and HTML for mobile app development. But ...

  9. html中看到php代码_如何在HTML中嵌入PHP代码

    如何在HTML中嵌入PHP代码 对于一个有经验的 PHP Web 开发者,在HTML中嵌入PHP代码是一件非常容易的事情.但是对于刚开始接触 PHP 编程语言的新手这就是一个问题.下面是小编为大家带来 ...

最新文章

  1. lte 中crs_LTE网络CRS功率配置及其影响研究
  2. 算法学习:强连通分量 --tarjan
  3. 边开飞机边换引擎?我们造了个新功能保障业务流量无损迁移
  4. SAP反记帐和红字冲销
  5. 如何实现一个符合泊松分布的即时消息发生器?
  6. 1.Getting Started
  7. php为什么要创建类,php – 是否有理由为单一功能创建类?
  8. 微信抢号软件_强推|那些写微信公众号一定要拥有的软件
  9. uniapp ios 跳转appstore
  10. QA和软件测试员的区别
  11. 判别机器大小端,打印int的二进制
  12. 如何快速获取淘宝商品的详细信息?看这里就够了
  13. Mysql 获取成绩排序后的名次
  14. 用 Python 解数独(Sudoku)
  15. python报错:fails to pass a sanity check due to a bug in the windows runtime
  16. python爬虫用到的技术_python爬虫技术的选择
  17. 第十二讲 dom对象(DOM对象、document对象的常用方法、节点、查找结点、 查看/修改/删除属性节点、创建和增加节点)
  18. ArcGIS使用字段计算器python脚本整理三规合一图斑
  19. 混合馈能悬架的设计与仿真(MATLAB)
  20. cft-wp-百度杯CTF比赛 九月场(upload)

热门文章

  1. 正则表达式真的很骚,可惜你不会写
  2. Spring Bean 定义
  3. [中级]Java命令学习系列(五)——jhat
  4. 数组:完成等差等比数列,及其他数列
  5. java弹弹球实验报告_Java弹球游戏实验报告—chen
  6. MySQL的CRUD操作+使用视图
  7. java集合——集合与数组间的转换+算法
  8. SpringBoot整合Redis要注意的那些
  9. 使用阿里巴巴json映射_使用JSON模式验证来映射稀疏JSON
  10. poi动态创建文档_POI创建的文档具有不同条件的灵活样式