`

Java中令人发狂的程序语言的特性

    博客分类:
  • Java
 
阅读更多

Java的Integer cache

Java代码   收藏代码
  1. Integer foo = 1000;  
  2. Integer bar = 1000;  
  3.   
  4. foo <= bar; // true  
  5. foo >= bar; // true  
  6. foo == bar; // false  
  7.   
  8. //然后,如果你的 foo 和 bar 的值在 127 和 -128 之间(包括)  
  9. //那么,其行为则改变了:  
  10.   
  11. Integer foo = 42;  
  12. Integer bar = 42;  
  13.   
  14. foo <= bar; // true  
  15. foo >= bar; // true  
  16. foo == bar; // true  

为什么会这样呢?你需要了解一下Java Interger Cache,下面是相关的程序,注意其中的注释

Java代码   收藏代码
  1. /** 
  2.  
  3.      * Returns a <tt>Integer</tt> instance representing the specified 
  4.  
  5.      * <tt>int</tt> value. 
  6.  
  7.      * If a new <tt>Integer</tt> instance is not required, this method 
  8.  
  9.      * should generally be used in preference to the constructor 
  10.      * <a href="mailto:{@link">{@link</a> #Integer(int)}, as this method is likely to yield 
  11.      * significantly better space and time performance by caching 
  12.      * frequently requested values. 
  13.      * 
  14.      * @param  i an <code>int</code> value. 
  15.      * @return a <tt>Integer</tt> instance representing <tt>i</tt>. 
  16.      * @since  1.5 
  17.      */  
  18.     public static Integer valueOf(int i) {  
  19.         if(i >= -128 && i <= IntegerCache.high)  
  20.             return IntegerCache.cache[i + 128];  
  21.         else  
  22.             return new Integer(i);  
  23.     }  

 

Java的异常返回

请看下面这段程序,你觉得其返回true还是false?

Java代码   收藏代码
  1. try {  
  2.     return true;  
  3. finally {  
  4.     return false;  
  5. }  

 在 javascript 和python下,其行为和Java的是一样的。

 

错误1:长整数赋值问题 

   系统有一个功能要产生邀请码,客户通过邀请码进行注册,但是邀请码要有过期时间,希望60天后过期,过期时间采用毫秒数: 

Java代码  收藏代码
  1. long EXPIRED_DATE = 60 * 24 * 60 * 60 * 1000;  


   可是,测试人员告诉我,邀请码10天不到就过期了,我看了代码,百思不解,最后跟踪了代码,才发现

引用
60 * 24 * 60 * 60 * 1000

并不会自动转化为long,而是一个int,10天的毫秒数就超过了int的最大值了,因此10天不到就过期了! 
   这儿犯下的错误是其实对 “整数字面值赋值时默认为int型”这个基础Java知识的忽视造成的.如果要让JVM将字面数字当成long,则必须在字面数字后显示加L标识,所以这个BUG是这样解决的: 

Java代码  收藏代码
  1. long EXPIRED_DATE = 60 * 24 * 60 * 60 * 1000L;  



错误2:数值越界的问题 
   
    我写的一个模块允许开发者注册插件,为了控制插件执行的先后顺序,因此我写了一个Orderable接口,插件实现该接口以决定执行的先后顺序(orderNo越小越先执行): 

Java代码  收藏代码
  1. public interface Orderable {  
  2.     /** 
  3.      * 排序号,越小越在前面 
  4.      */  
  5.     int getOrdreNo();  
  6. }  


    
    然后写了一个Comparator,以便可以通过java.util.Collections的 
   

Java代码  收藏代码
  1. sort(List<T> list,Comparator<? super T> c)  


    对插件List进行排序。Comparator是这样写的: 

Java代码  收藏代码
  1.    public class OrderableComparator implements Comparator {  
  2.     private static OrderableComparator intance = new OrderableComparator();  
  3.   
  4.     private OrderableComparator() {  
  5.     }  
  6.   
  7.     public int compare(Object obj1, Object obj2) {  
  8.         int order1 = Integer.MAX_VALUE;  
  9.         int order2 = Integer.MAX_VALUE;  
  10.         if (obj1 instanceof Orderable) {  
  11.             order1 = ((Orderable) obj1).getOrdreNo();  
  12.         }  
  13.         if (obj2 instanceof Orderable) {  
  14.             order2 = ((Orderable) obj2).getOrdreNo();  
  15.         }  
  16.         return order1 - order2;//① 大家注意这儿是出鬼的地方!!!  
  17.     }  
  18.   
  19.     public static OrderableComparator getIntance() {  
  20.         return intance;  
  21.     }  
  22. }  


    但是一个兄弟咆哮地告诉我,它的插件的getOrderNo()已经设置为Integer.MIN_VALUE,但是却在最后一位执行!!! 
    跟踪了代码,才发现是对数值越界问题的忽视而造成了这个低级错误,下面具体分析一下,如Plugin1的getOrdreNo()为Integer.MIN_VALUE,而Plugin2的getOrdreNo()为1,可是大家想想下面的计算值是多少呢? 
   

Java代码  收藏代码
  1. Integer.MIN_VALUE - 1  


   是2147483647!! 
   找到问题后改起来是不费工夫的: 

Java代码  收藏代码
  1. public int compare(Object obj1, Object obj2) {  
  2.     int order1 = Integer.MAX_VALUE;  
  3.     int order2 = Integer.MAX_VALUE;  
  4.     if (obj1 instanceof Orderable) {  
  5.         order1 = ((Orderable) obj1).getOrdreNo();  
  6.     }  
  7.     if (obj2 instanceof Orderable) {  
  8.         order2 = ((Orderable) obj2).getOrdreNo();  
  9.     }  
  10.        
  11.     if(order1 > order2){  
  12.         return 1;  
  13.     }else if(order1 < order2){  
  14.         return -1;  
  15.     }else{  
  16.         return 0;  
  17.     }  
  18. }  


分享到:
评论

相关推荐

    找乐儿-百度贴吧发狂 v1.0

    1. **BaiduTiebaFaKuang.exe**:这是主应用程序文件,通常是一个可执行程序,用户可以通过运行这个文件来启动"找乐儿-百度贴吧发狂 v1.0"软件。 2. **chinaz.com说明.txt**:这可能是一个来自知名网站Chinaz(站长...

    三子连珠游戏VC++程序

    编一棋盘游戏程序,可以选择人机对战和双人对战两种游戏模式,而人机模式下可以选择三种电脑等级,即简单的电脑、中等的电脑和令人发狂的电脑,电脑智能化程度随等级提高而提高。下棋双方分别以字符X和字符O为棋子。...

    AS3 MD5姓名大战 源码

    ActionScript 3作为一款高级编程语言,具有面向对象的特性,能够高效地处理多媒体和网络通信。在本游戏中,AS3的灵活性和强大的控制能力得到了充分展现,尤其是在处理复杂的逻辑判断和动画效果上。 #### 四、总结 ...

    高中英语单词天天记self素材

    - “名词+self”:如“beauty's self”(美的化身)、“pity's self”(极令人遗憾的事物)等,这种用法赋予了“self”一种象征意义。 在搭配和句型中,“self”有多种使用方式,例如: - “动词+self”:如...

    方便快捷通讯录挺使用的一个东西

    标题中的“方便快捷通讯录”指的是这样一类应用,它能够帮助用户快速、高效地管理联系人信息,实现便捷的通信。这类应用通常具有多种功能,如分类管理、搜索查找、同步更新等,极大地提高了人们处理社交关系的效率。...

    hibernate3.3 struts-2.3.20 spring3.2.3 整合框架

    SSH框架,全称为Struts2、Hibernate和Spring的集成,是Java Web开发中常见的三大开源框架的组合。这个整合框架提供了强大的模型-视图-控制器(MVC)架构支持,数据库操作以及依赖注入等特性,极大地提高了开发效率和...

    mybatis 逆向工程 generatorSqlmapCustom

    MyBatis逆向工程是开发过程中一个非常实用的特性,它可以帮助我们自动化生成与数据库表相关的Java接口、Mapper XML文件以及实体类,极大地提高了开发效率。`generatorSqlmapCustom`是MyBatis逆向工程的一个自定义...

    win10更改输入法切换方式(ctrl+空格)

    升级到win10后,很多更新还是特别喜欢的,但有一些更改有违以往的操作习惯,也到了让人发狂的地步,比如输入法切换,需要win+空格,特别不习惯,特别是对于it从业者更是如此,因为默认是中文输入法,大家都懂的 ...

    2017_2018学年中考英语一轮复习M开头词汇一讲义20180811126

    短语如"be/get/go mad" 意为“发狂,失去理智”,"drive sb mad" 表示某事使人极度烦躁,“Mum went mad when she heard the noise.”(妈妈听到噪音时很生气。) 3. **Magazine**:杂志,名词,指定期出版的印刷...

    (中小学教育)中考语文复习:成语辨析专题课件.ppt

    例如,将原文中的词语替换为成语,可以使句子更具文学色彩,如“风和日丽”代替“天气不错”,“欣喜若狂”代替“高兴得快要发狂”,“早出晚归”描述父亲辛勤工作,“筋疲力尽”描绘疲劳状态,“人山人海”形容人群...

    高中英语常见名词词汇.doc

    【高中英语常见名词词汇解析】 在高中英语学习中,掌握常见的名词词汇至关重要,因为它们是构建句子和表达思想的基础。以下是一些关键的名词及其...同时,了解这些词的不同搭配和短语将大大提升语言的丰富性和准确性。

    excel 中做的游戏“名字大战”

    相当有趣的名字大战,模拟迅雷等游戏制做,有击晕,发狂等攻击。奇乐无穷。

    ng-grunt-karma-starter:发狂的因果报应

    ng-grunt-karma-starter ng-grunt-karma-starter 它是带有业力单元测试的角度应用模板。 Grunt用于开发。 运行该应用程序grunt

    ephemeraldb:MongoClient的临时方法

    这就是为什么我制作了这个令人发狂的模块以自动关闭连接的原因。 我在Debian上构建了这个东西,但是无法连接。 我不相信它无法连接,所以我在Windows上完成了测试。 因此,我们稍后会看到什么。 因为瞧瞧,它可以...

    老子道德经全文.doc

    驰骋畋猎,令人心发狂。」 在这里,老子讲述了感官的限制。老子认为,感官是有限的,它们不能完全地感知宇宙。 第十三章:宠辱若惊 老子曰:「宠辱若惊,贵大患若身。何谓宠辱若惊?」 在这里,老子讲述了「宠」...

    全套人教版九年级英语Unit 11同步练习题及答案13精选.doc

    crazy/mad"(使人发疯/发狂)等,这些表达方式能够增强学生的语言表达能力,使他们能更生动地描绘情感状态。同时,"the more…the more…"这样的句型训练,有助于学生掌握比较级的用法。 Section B中,新增了一些...

    四川省成都市金堂县又新镇九年级英语全册Unit11Sadmoviesmakemecry2导学案无答案新版人教新目标版201807

    2. 使人发疯/发狂:drive sb. crazy/mad 3. 越...越...:the + 比较级 + ...,the + 比较级 + ... 4. 成为某人的朋友:become friends with sb. 5. 忽略/不考虑:leave out 课堂活动包括听前预测、听中理解和听后...

    c语言现代方法16章答案word版

    在 C 语言中,结构体是一种复杂的数据类型,可以包含多个成员变量。结构体的声明格式为 `struct {成员变量列表} 结构体名;`。例如,`struct { int x, y; } x;` 声明了一个名为 `x` 的结构体,拥有两个成员变量 `x` ...

    小学语文成语大全形容喜悦心情的成语

    这些成语不仅仅是文字游戏,它们背后蕴含的丰富情感和人生哲理,是孩子们在学习过程中需要理解和体会的,有助于提高他们的语言素养和文化修养。通过掌握这些成语,小学生可以更好地表达自己的情绪,同时也能够更好地...

Global site tag (gtag.js) - Google Analytics