臭名昭著的Java错误和陷阱

在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

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

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

相关文章

php oracle 配置,关于php:为Windows 64位配置Oracle OCI8

我一直在为Windows配置oracle oci8时遇到问题我正在使用Windows 7 64位,xampp v3.2.2,php 5.6.15和oracle g11 Express我尝试了以下步骤,但是在运行phpinfo时找不到oci软件包:我同时下载了Instant Client Package-Basic和Instant …

CSS_常见布局

1.一列布局——常用于网站首页。 html&#xff1a; 1 <div class"top"></div> 2 <div class"main"></div> 3 <div classfoot></div> css&#xff1a; 1 body{2 margin:0;3 padding: 0;4 …

解决android studio引用远程仓库下载慢(JCenter下载慢)

原文&#xff1a;https://blog.csdn.net/linglingchenchen/article/details/62236723 第一种方法 使用开源中国的maven库 阿里云的(速度飞快)&#xff1a;http://maven.aliyun.com/nexus/content/groups/public/ 替换项目根目录下build.gradle中的 repositories {jcenter()} 为…

Java中的工厂方法模式

在我以前关于模板方法模式的文章中 &#xff0c;我展示了如何利用lambda表达式和默认方法 。 在本文中&#xff0c;我将探讨工厂方法模式&#xff0c;并了解如何利用方法引用&#xff0c;这是Java 8中与lambda表达式一起添加的另一项功能。 让我们考虑一个Vehicle接口及其两个…

会员系统用php框架,代码基地会员中心的PHP签到系统结合thinkphp框架

分享代码基地会员中心的PHP签到系统&#xff0c;PHP很漂亮的签到界面。签到后&#xff0c;会有不同颜色区分。附带PHP签到源码带安装说明和详细注释。(详细查看https://www.daimajidi.com/deal/574)JS:function getUrl(strs) {var url "/demo/1563064903/" strs;re…

MVP数据请求recycview展示

M层 public class Mod {public void shuju(final Modlister modlister){ OkHttpClient okHttpClientnew OkHttpClient();final Request requestnew Request.Builder().url("http://v.juhe.cn/weixin/query?key55010ae808217e996bbf414bbdad843c").build(); Call …

impress.js

介绍一下 impress.js是一个非常炫酷的幻灯片展示框架&#xff0c;依靠CSS3技术。 impress.js使用起来非常简单&#xff0c;下面就来简单介绍一下其用法。 Start 首先&#xff0c;当然要引入impress.js。 在div标签设置id为impress&#xff08;不要求一定是div&#xff09;…

Spring MVC:表单处理卷。 1个

Spring MVC是Spring Framework的一部分&#xff0c;其主要目的是使Web开发更加简单&#xff0c;便捷和轻松。 与表单的交互是或多或少现代Web应用程序的一部分。 Spring MVC允许您以非常严格和简单的方式执行各种形式的活动。 在本文中&#xff0c;您将在Spring MVC的帮助下阅读…

用php打出前一天的时间格式,[php]用PHP打印出前一天的时间格式

echo date("Y-m-d H:i:s",strtotime("-1 day"));例子echo(strtotime("now"));echo(strtotime("3 October 2005"));echo(strtotime("5 hours"));echo(strtotime("1 week"));echo(strtotime("1 week 3 days 7 …

《Python学习之路 -- 字符串的方法》

在前面已经提到Python中的字符串了&#xff0c;本文来列举介绍字符串的方法&#xff0c;我将字符串的方法分为以下几类&#xff1a; ①查询方法 str.find(target,startNone,endNone) 该方法用于查询字符串str中是否含有target&#xff0c;如果有&#xff0c;则返回target在这个…

Java监视器绑定的超人

这是超人生活中的黑暗时期。 乔尔艾尔&#xff08;Jor-El&#xff09;希望他继续航行&#xff0c;为他的最终命运做好准备。 然而&#xff0c;地球面临着世界末日&#xff0c;正义联盟需要他们的钢铁侠行动来拯救世界。 但是由于我们只有一个超人&#xff0c;您不能同时做这两个…

C语言第一次实验报告

一&#xff0e;实验题目&#xff0c;设计思路&#xff0c;实现方法 第四次 计算分段函数和循环NEW 4-3 求N分之一序列前N项和 4-6 输出华氏-摄氏温度转换表 第四次 分支循环 加强版 4-2-7 装睡 设计思路&#xff1a;4-3开始需要计算大量式子&#xff0c;因此利用到相对便捷的…

php充值卡,ecshop 充值卡功能_懒人程序

/*显示页面的action列表*/$ui_arrarray(register,login,profile,... 增加cz然后在下面代码处加入if ($actioncz)//冲值{ if($_GET[a]add){ if (empty($_SESSION[user_id])){ show_message(该用户不存在。,返回上一页,user.php?actcz);} else{ $kstrtoupper(substr($_POST[k],0…

CSS实现垂直居中的5种方法

利用 CSS 来实现对象的垂直居中有许多不同的方法&#xff0c;比较难的是选择那个正确的方法。我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站。 使用 CSS 实现垂直居中并不容易。有些方法在一些浏览器中无效。下面我们看一下使对象垂直集中的5种不同方法&#xf…

尝试使用jBPM Console NG(测试版)

大家好&#xff01; 这是关于jBPM Console NG的另一篇文章。 经过6个月的辛苦工作&#xff0c;我很高兴为开发者社区撰写这篇文章&#xff0c;以进行尝试。 在这篇文章中&#xff0c;我将解释如何从源代码构建应用程序。 这背后的主要思想是知道如何在测试过程中设置环境并修改…

三个实用的提升网页性能技巧

1、display属性设置 先将元素设为 display: none&#xff08;需要1次重排和重绘&#xff09;&#xff0c;然后对这个节点进行100次操作&#xff0c;最后再恢复显示&#xff08;需要1次重排和重绘&#xff09;。这样一来&#xff0c;你就用两次重新渲染&#xff0c;取代了可能高…

mysq在某一刻同时获取主从库的位置点

在从库进行锁表操作flush table with read lock&#xff0c; 通过show slave status\G 获取对应主库的位置点&#xff1a; show slave status\G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host…

php在window磁盘管理,Windows Server 2008R2设置磁盘阵列

RAID(独立硬盘冗余阵列)指用多个硬盘组成一个高性能、大容量的一个硬盘组合。独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks)&#xff0c;旧称廉价磁盘冗余阵列(RedundantArray of Inexpensive Disks)&#xff0c;简称硬盘阵列。其基本思想就是把多个相对便宜的…

解决Error: ENOENT: no such file or directory, scandir 安装node-sass报错

新项目开发需要安装依赖&#xff0c;但是安装完之后通过gulp运行项目&#xff0c;产生了一下的报错&#xff1a; 解决方案是执行一些方法&#xff1a; npm rebuild node-sass可是有时就是网络问题导致上面命令安装失败&#xff0c;查下失败提示&#xff0c;有可能是&#xff1a…

没有应用程序服务器

我们最近发布了有关从免费Plumbr部署中收集的应用服务器市场份额的数据 。 它产生了很好的共鸣-通过不同的渠道&#xff0c;我们获得了数百种有关如何解释数据的评论。 但是&#xff0c;通过各种渠道不断提出一种形式不同的论点。 无论是采用“ T omcat不是应用程序服务器 ”的…