在2000年,我上大学,濒临选择一种语言来发展自己的职业。 Java尚未成为主流,但很受人们欢迎。 与静态html页面相比,小应用程序(尚未破碎)花哨且富有光泽。 Swing不是构建桌面应用程序的不错选择。 J2EE越来越受到关注。 从那时起已经过去了13年,尽管小程序失败了,Java成为主流,尽管对于小应用程序而言,它并没有真正考虑到这一点,而且J2EE太复杂了,甚至无法构建简单的东西,但是仍然没有什么阻止Java成为最受欢迎的编程语言。

毫不奇怪,Java非常漂亮,类型安全且易于学习。 Java中有很多很好的实现细节,例如垃圾收集器,字符串
(最终类),提供了合并和快速排序的出色实现的集合,内置在哈希码方法中的等等。 但是,Java仍然远非完美,可能会引入一些意想不到的行为。

Abs错误:

好吧,这是一个非常小的缺陷,但是Math.abs()函数可能会返回负值。 奇怪的? 实际上很简单,Java整数可以得到-2,147,483,648到2,147,483,647之间的值,这清楚地表明-2,147,483,648不能以正数表示。

那是一个错误吗? 好吧,期望值是正的,所以可以肯定,但是最终这实际上是一个溢出。 那么如何解决呢? 一种方法是在使用abs函数或使用位运算符代替之前操纵Integer.MIN_VALUE。

自动装箱基元陷阱:

通过自动装箱,可以轻松地使用基本类型及其对象对应物。 但是,在它们之间移动可能会导致某些意外行为。 例如,不能使用==运算符将Integer i1 = 6与Integer i2 = 6进行比较,其中可以将int i3 = 6与具有==的整数进行比较。 但是,使用equals可能也无法按预期工作。 例如Long x = 0L; 当x.equals(0L)返回true,而当x.equals(0)返回false。 奇怪的? 并非如此,因为x很长,其中0(没有L)是int。 因此,它们甚至不是相同的对象类型。 还将原始类型与集合一起使用可能会导致意外行为。 最后,自动装箱可能会导致过载问题。 假设我们有Integer i = 6并调用方法sum(i); 我们有两种求和方法,例如; sum(long val)和sum(Long val)。 您认为会叫哪一个? 还是合理的,但不希望乍一看,可能会导致应用程序出现问题。

BigDecimal构造函数错误:

如果您尚未查看Joshua Bloch的Java Puzzlers 。 如果使用双精度构造函数创建两个大十进制数(x1 = new BigDecimal(2.00)和x2 = new BigDecimal(1.10)),然后使用减法(x1.subtract(x2)),则最终结果为0.8999999999。 BigDecimal的double构造函数无法按预期工作,而需要使用字符串构造函数(新的BigDecimal(“ 2.00”))。 这可能是一个严重的问题,因为BigDecimal被广泛用于金钱计算!

System.out.println陷阱:

println()是对CS学生更难的第一个函数。 它很容易并且经常使用。 当您尝试某些逻辑或调试某些值时,通常可以使用。 但是System.out是同步的,因此在访问时会获取一个锁。 因此,使用println可能会使您的应用程序在同步上下文中运行,这实际上意味着访问println时线程将被阻塞。 想象一下使用println的Web服务器和应用程序日志记录,您最终将获得线程锁,并且每个请求都在等待其他请求。 因此,println可以而且有用,但不适用于实际的应用程序和日志记录!

地图错误:

再次看一下Joshua Bloch的Java Puzzlers ,第五个难题(大小很重要)在HashMap和EnumMap之间引入了一种奇怪的行为,其中具有相同的值,一个地图的大小为2,另一个地图的大小为1。作为IdentityHashMap,EnumMap可能会引入此行为。

这是错误吗? 可以肯定的是,我们期望地图实现中具有相同的原理,但是Bloch描述了这一点,因为当时的规范尚不清楚。

CPU编号错误:

除非您真的依赖硬件,否则这可能不是一个大问题。 为了获得可用处理器数,Java提供了Runtime.getRuntime()。availableProcessors()方法,该方法返回一个int数作为可用处理器数。 但是,如果尝试一下,最终可能会得到意外的数字。 例如,在我的四核i7上,我得到8。因此,此方法不返回硬件cpus数量,也不是核心数量,而是返回执行引擎(虚拟核心)数量。 就我而言,因为四核i7支持超踩,所以实际上它就像拥有八核。

那是一个错误吗? 绝对不是,因为硬件和操作系统的运行方式就好像它们具有的物理CPU数量一样,但是如果您依靠可靠的硬件,仍然要小心。

通用数组

在Java中,创建数组的方式如下:int [] arr = new int [5]; 因此,如果您具有T的通用类型,则希望以这种方式创建通用数组:T [] = new T [5]; 但根本不能。 Java不允许创建泛型数组,这实际上是因为泛型是使用Erasure在Java中实现的。 泛型仅在编译器级别实现,实际上每个类仅生成一个类文件。 因此,要创建数组,我们需要进行如下丑陋的转换:T [] =(T [])new Object [5]; 当您尝试编译时,编译器会发出警告,提示您正在进行不安全的转换!

当然,这不是错误,它只是在实现泛型时为了简化和兼容性而给出的实现问题。 但是在设计问题上发出编译器警告可能会使第一次遇到该问题的人感到困惑。 因此,这绝对不是清单的结尾,但是Java仍然提供了漂亮的语法,类型安全性和易于实现的易于学习的语言。 最后,没有语言或实现是完美的!

参考: Developer Chronicles博客上来自我们JCG合作伙伴 Murat Yener的臭名昭著的Java错误和陷阱 。

翻译自: https://www.javacodegeeks.com/2013/04/infamous-java-bugs-and-pitfalls.html

臭名昭著的Java错误和陷阱相关推荐

  1. 常见Java错误的十大列表(前100名!)

    前10名名单非常受欢迎,有趣且内容丰富. 但是有很多! 如何选择合适的? 这是一个元前10名列表,可帮助您找到前10名的前10名列表. 在更令人讨厌的笔记上: SELECT TOP 10 mistak ...

  2. 苹果电脑错误代码43_苹果最臭名昭著的代码错误

    苹果电脑错误代码43 'Bug', a term that makes most developers dread at night and the reason why they incessant ...

  3. Error:java: 错误: 不支持发行版本 14

    Error:java: 错误: 不支持发行版本 14 修改全局设置 修改module设置 在我换了电脑把IDEA的project转移过来之后,开始出现了问题 修改全局设置 修改 Files -> ...

  4. Java 错误: 找不到或无法加载主类,问题集合

      正确编译命令: javac Hello.java 正确运行命令: java Hello 错误1:H:\code>java Hello.java 错误: 找不到或无法加载主类 Hello.ja ...

  5. java错误 找不到或无法加载主类

    java:错误: 找不到或无法加载主类 1.确定JDK版本 ​ 因为随着时间的改变,JDK本身也伴随着更改和变化,在解决这个问题前,我们要确定一下jdk的版本,比较老的版本有老的版本的解决方法,比较新 ...

  6. 解决IntelliJ IDEA报错Error: java: 错误: 不支持发行版本 XX

    解决IntelliJ IDEA报错Error: java: 错误: 不支持发行版本 XX 解决方法 1 解决方法 2 解决方法 3   笔者在做代码重构的时候,以前记得运行正常的代码,如今一直报错,百 ...

  7. java 错误输入异常_在Java中进行输入验证期间用错误通知替换异常

    java 错误输入异常 在我以前的文章中,我写了一篇关于输入验证设计的文章 ,该设计取代了难以维护和测试的 if-else块. 但是,正如某些读者指出的那样,它有一个缺点–如果输入数据有多个验证错误, ...

  8. 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案

    基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案 最近在研究Java,涉及命令行编译,使用notepad++编辑器,然后使用javac编译: 之前的几个文件没有中文的内容,都没 ...

  9. 【JAVA错误笔记】 - 【Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法】

    [JAVA错误笔记] - [Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法] 参考文章: (1 ...

最新文章

  1. nodejs繁琐地自建路由
  2. Java的加载与执行原理详解 Java程序从编写到最终运行经历了哪些过程
  3. OD的 CC断点,内存访问断点,硬件断点 解析
  4. C++ 11 深度学习(六)智能指针综述
  5. Python装饰器(二)
  6. JAVA8之妙用Optional解决判断Null为空问题
  7. 开源mes系统_如何让iMES系统快速落地变得so easy?
  8. zabbix监控mysql内存_zabbix通过自定义脚本监控nginx,php-fpm和mysql占用内存数和进程的个数...
  9. 拓端tecdat|R语言ARMA-GARCH-COPULA模型和金融时间序列案例
  10. tcpip路由技术卷一_学网络拿高薪!「纯干货」IELAB路由技术问题总结1
  11. Microsoft 补丁下载
  12. 中国芯的ISSCC/JSSC之路
  13. 商业广告CPT-物料召回
  14. [OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器
  15. 【杂题】cf1041fF. Ray in the tube
  16. (原)Opencv中直方图均衡和图像动态范围拉伸的代码
  17. 4个经典案例:国外社交媒体是这样病毒性营销的
  18. 支付宝正式发布黑莓版客户端
  19. CentOS 7下編譯安裝和配置GoldenDict
  20. redis cli 删除key 模糊_Web基础配置篇(六): Redis的安装配置及基本操作

热门文章

  1. css 图片换行_好程序员web前端学习路线分享CSS浮动-文档流篇
  2. spring 构造函数注入_Spring构造函数依赖注入示例
  3. aws jenkins_Jenkins在AWS上(第1部分)
  4. trackby_使用trackBy启动流程
  5. 小程序可不可以汉字命名_不可将您的方法命名为“等于”
  6. java学习里程碑_记录您的里程和社区运行情况:Java EE 7真实体验
  7. Java中的适配器设计模式
  8. Java EE 8安全性API:概述
  9. 使用Zipkin和Sleuth进行SpringBoot微服务跟踪
  10. 使用Spock Mocks进行Grails 3.3集成测试