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中,也存在错误代码!
翻译自: https://www.javacodegeeks.com/2013/04/even-in-the-jdk-there-is-bad-code.html
jdk8运行jdk7的代码
jdk8运行jdk7的代码_即使在jdk中也有错误的代码相关推荐
- 即使在jdk中也有错误的代码
Java 7,TreeSet和NullPointerException. 最近,我尝试用Java 7编译一个用Java 6开发的项目.在执行测试过程中发生了很多有趣的事情,在Java 6中使用Java ...
- amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境
今天给大家分享一下如何配置java的JDK环境.操作步骤如下: 1.下载好 jdk 的安装文件,我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件: 2.使用 ...
- react入门代码_如何在React中构建温度控制应用程序-包括提示和入门代码
react入门代码 我们正在建立的 (What we're building) In this beginner React project, we're going to learn how to ...
- java cxf服务端代码_【JAVA】 cxf 生成 webservice 服务端代码
CXF Apache CXF = Celtix + XFire.CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding . ...
- java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势
java 编写代码 2016年最有趣的Java相关主题 关于代码,有很多热门话题,而要跟上所有事情,这是一项全职的工作. 如果您想知道如何从谷壳中分离出小麦,我们已经为您完成了工作. 在下面的文章中, ...
- python快速接手别人的代码_十步教你如何接手别人的代码!
想必在很多程序员的职业生涯中,都有过一种难以避免的状况,即接下别人的代码.而这是种怎样的体验?有人说,接手别人的代码之后我也想辞职:有人说,一个连注释都没有的代码有何灵魂可言:更有网友说,如果你恨一个 ...
- python武器代码_程序员需要掌握的七种 Python 代码更易维护的武器
检查你的代码风格 PEP 8 是 Python 代码风格规范,它规定了类似行长度.缩进.多行表达式.变量命名约定等内容.尽管你的团队自身可能也会有稍微不同于 PEP 8 的代码风格规范,但任何代码风格 ...
- qml延迟代码_选择C而不是QML将您的代码减少80
qml延迟代码 Many tools rely on web technologies like JavaScript and HTML for mobile app development. But ...
- html中看到php代码_如何在HTML中嵌入PHP代码
如何在HTML中嵌入PHP代码 对于一个有经验的 PHP Web 开发者,在HTML中嵌入PHP代码是一件非常容易的事情.但是对于刚开始接触 PHP 编程语言的新手这就是一个问题.下面是小编为大家带来 ...
最新文章
- lte 中crs_LTE网络CRS功率配置及其影响研究
- 算法学习:强连通分量 --tarjan
- 边开飞机边换引擎?我们造了个新功能保障业务流量无损迁移
- SAP反记帐和红字冲销
- 如何实现一个符合泊松分布的即时消息发生器?
- 1.Getting Started
- php为什么要创建类,php – 是否有理由为单一功能创建类?
- 微信抢号软件_强推|那些写微信公众号一定要拥有的软件
- uniapp ios 跳转appstore
- QA和软件测试员的区别
- 判别机器大小端,打印int的二进制
- 如何快速获取淘宝商品的详细信息?看这里就够了
- Mysql 获取成绩排序后的名次
- 用 Python 解数独(Sudoku)
- python报错:fails to pass a sanity check due to a bug in the windows runtime
- python爬虫用到的技术_python爬虫技术的选择
- 第十二讲 dom对象(DOM对象、document对象的常用方法、节点、查找结点、 查看/修改/删除属性节点、创建和增加节点)
- ArcGIS使用字段计算器python脚本整理三规合一图斑
- 混合馈能悬架的设计与仿真(MATLAB)
- cft-wp-百度杯CTF比赛 九月场(upload)