陷阱和缺陷的目录
一、词汇问题
1、字母l在许多字体中都与数字1相像。
2、负的十六进制字面常量看起来像是正的。
3、八进制字面常量与十进制字面常量相像。
4、ASCII字符的Unicode转义字符容易令人迷茫。
5、反斜杠必须被转义,即使是在注释中。
6、块注释不要嵌套。
二、整数运算
1、%操作符的非零结果具有和左操作数相同的正负号。
2、整数运算的悄悄溢出。
3、int数值之差的正负号不能可靠地指示其大小顺序。
4、复合赋值操作符可能造成悄悄的窄化转型。
5、整数类型不对称:Integer.MIN_VALUE是它自己的负值,Long.MIN_VALUE也一样。
6、移位操作符只用了其右操作数的低位。
7、当在整数类型之间转换时,如果源类型是有符号的则执行符号扩展。
三、浮点运算
1、浮点运算是不精确的。
2、NaN不等于任何浮点数值,包括它自身。
3、从int到float,从long到float以及从long到double的转换是有损精度的。
4、BigDecimal(double)构造器返回的是其浮点型参数的精确值。
四、表达式计算
1、混合类型计算容易令人迷茫。
2、操作符的操作数是从左到右计算的。
3、操作符的优先级并不总是很明显。
4、操作符==和!=在被包装的基本类型上执行引用比较。
5、常量变量在所用的地方是内联的。
6、操作符&和|即使在作用于布尔类型的数值时,也要同时计算其两个操作数。
五、控制流
1、在switch case语句中缺少break将导致控制流一贯而下。
2、在Integer.MAX_VALUE上终止以int为索引的循环是困难的。
3、finally语句块的意外完成将掩饰挂起的控制传输。
4、为正常的控制流使用异常将导致bug和很差的性能。
六、类初始化
1、类初始化是自顶向下的。
2、NoClassDefFoundError出现的时机是不可靠的。
七、实例的创建与销毁
1、实例初始器在构造器方法体之前执行。
2、在构造器中调用被覆写的方法会导致该方法在实例初始化之前运行。
3、引用无效会导致内存泄露。
4、添加私有构造器失败会使类可实例化。
5、终结器是不可预知的、危险的,且速度很慢。
6、被克隆的对象可以共享内部状态。
八、其他与类和实例相关的主题
1、在静态方法上没有任何动态分派。
2、内部类是令人迷茫的。
3、不能做保护复制就会破坏不变性。
4、实现一个接口会影响实现类的API。
5、int常量作为枚举值不安全。
6、混合使用基本类型和参数化类型将弱化类型检查机制。
7、返回null而不是0长度的数组或者集合有产生错误的倾向。
九、名字重用
1、想要覆写时很容易就变成了重载。
2、重载解析规则不明显。
3、隐藏实体的程序难以理解。
4、遮蔽实体的程序难以理解。
5、遮掩实体的程序难以理解。
6、与所在类具有相同名字的方法看似构造器。
7、重用平台类名的程序难以理解。
十、字符串
1、数组不能覆写Object.toString。
2、String.replaceAll以正则表达式作为第一个参数。
3、String.replaceAll以置换字符串作为第二个参数。
4、重复地进行字符串连接可能导致极差的性能。
5、从字节数组到字符数组的转换需要指定字符集。
6、char类型值只会默认转换成int,而不是String。
十一、I/O
1、Stream.close可以抛出IOException异常。
2、PrintStream.write(int)不刷新输出流。
3、要消费掉一个进程的输出,否则该进程可能挂起。
十二、线程
1、调用Thread.run不能启动一个线程。
2、库类可能锁住或通知它们的实例。
3、Thread.interrupted会清除中断状态。
4、类初始化过程中将持有该类的锁。
5、在共享可变状态时同步失败,可能导致不能观察状态的变化。
6、在被同步的语句块中调用外部方法可能导致死锁。
7、在while循环的外部调用wait方法会引发不可预知的行为。
8、对线程调度器的依赖可能导致不定的且平台依赖的行为。
十三、反射
1、反射将检查对实体和实体所属类的访问权限。
2、用反射实例化内部类需要一个额外的参数。
3、Class.newInstance可以抛出未声明的受检查异常。
十四、序列化
1、让一个类可序列化将引入一个公共的伪构造器。
2、序列化形式是类的公共API的一部分。
3、使用默认的序列化形式会在类的公共API中泄露私有字段。
4、使用默认的序列化形式可能会导致性能低下。
5、维护实例的不变规则需要一个readResolve方法。
6、声明序列版本UID失败会导致脆弱。
7、如果readObject或readResolve调用了可覆写的方法,反序列化循环的对象可能引发崩溃。
十五、其他库
1、覆写equals方法而不覆写hashCode方法可能会引发不定的行为。
2、Calendar和Date设计得很差劲。
3、许多类不管其方法名是什么,这些类都是不可变的。
4、某些被废弃的方法对程序来说就是毒药。
5、使用自编的解决方案而不是库容易导致努力白费、bug产生以及极差的性能。
分享到:
相关推荐
本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...
该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...
Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...
讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java程序员阅读。
本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上...
该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...
Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...
不过,可以按照给定的要求,基于标题“Java解惑中文”和描述“本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,看完后会对Java加深理解”,来构建一些知识点。 标题《Java解惑中文》很可能是某本专注于解决Java...
本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...
本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上...
Java解惑(英文版)—典藏原版书苑 目录 1 introduction 2 expressive puzzlers puzzle 1:oddity puzzle 2:time for a change puzzle 3:long pision puzzle 4:it s elementary puzzle 5:the joy of hex puzzle 6...
在《JAVA解惑》这本书中,包含了大量关于Java编程语言的陷阱和缺陷,通过具体的谜题形式,帮助读者理解并避免这些潜在的问题。接下来,我将对书中提到的一些重要知识点进行详细说明。 首先,我们来了解关于Java...
Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...
### Java解惑知识点详解 #### 一、表达式谜题 **谜题1:奇数性** - **描述**:程序看似应该返回一个布尔值,表明一个数字是否为奇数,但结果却出乎意料。 - **解惑**:在进行模运算时,需要注意负数的情况。当输入...
在给定的标题“经典 java 解惑”和描述“java 解惑技术”中,主要涉及了一个关于Java编程语言中判断一个整数是否为奇数的方法及其潜在的问题。 **详细说明:** 在提供的部分代码内容中,有一个名为`isOdd`的方法,...