Java软件低级错误

上传人:飞*** 文档编号:44202565 上传时间:2018-06-08 格式:DOCX 页数:6 大小:36.82KB
返回 下载 相关 举报
Java软件低级错误_第1页
第1页 / 共6页
Java软件低级错误_第2页
第2页 / 共6页
Java软件低级错误_第3页
第3页 / 共6页
Java软件低级错误_第4页
第4页 / 共6页
Java软件低级错误_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《Java软件低级错误》由会员分享,可在线阅读,更多相关《Java软件低级错误(6页珍藏版)》请在金锄头文库上搜索。

1、Java 软件低级错误文档密级2018-5-25未经许可不得扩散第 1 页, 共 6 页Java软件低级错误软件低级错误1 Java 软件低级错误(一):资源未及时释放软件低级错误(一):资源未及时释放【解读】在使用文件、IO流、数据库连接等不会自动释放的资源时,应该在使用完毕后马上将其关闭。关闭资源的代码try.catch.finally的finally内执行,否则可能造成资源无法释放。 2 Java 软件低级错误(二):空指针异常软件低级错误(二):空指针异常【解读】空指针异常是编码过程中最常见的异常,在使用一个对象的时候,如果对象可能为空,需要先判断对象是否为空,再使用这个对象。在进行常

2、量和变量的相等判断时,建议常量对象化判断避免空指针异常:即将常量定义为Java对象封装类型(如将int类型的常量定义为Integer类型),这样在比较时可以将常量放在左边,调用equals方法进行比较,可以省去不必要的判空。 3 Java 软件低级错误(三):下标越界软件低级错误(三):下标越界【解读】访问数组、List等容器内的元素时,必须首先检查下标是否越界,杜绝下标越界异常的发生。 4 Java 软件低级错误(四):对象比较使用软件低级错误(四):对象比较使用“=”【解读】“=”符号只是单纯的比较对象引用的指针是否相等,也就是说Object a,b 若a = b 则说明a和b指向同一个对

3、象,若a和b指向不同的对象,即使这两个对象的值完全相同,这时候a != b。所以我们要用equals()方法判断对象的值是否相等。Java 软件低级错误文档密级2018-5-25未经许可不得扩散第 2 页, 共 6 页5 Java 软件低级错误(五):魔鬼数字软件低级错误(五):魔鬼数字【解读】在代码中使用魔鬼数字(没有具体含义的数字、字符串等)将会导致代码难以理解,应该将数字定义为名称有意义的常量。将数字定义为常量的最终目的是为了使代码更容易理解,所以并不是只要将数字定义为常量就不是魔鬼数字了。如果常量的名称没有意义,无法帮助理解代码,同样是一种魔鬼数字。在个别情况下,将数字定义为常量反而会

4、导致代码更难以理解,此时就不应该强求将数字定义为常量。 6 Java 软件低级错误(六):字符串转数字时未进行异常软件低级错误(六):字符串转数字时未进行异常处理处理【解读】调用Java方法将字符串转换为数字时,如果字符串的格式非法,会抛出运行时异常NumberFormatException。 7 Java 软件低级错误(七):软件低级错误(七):Calendar 的错误使用的错误使用【解读】Calendar从星期日开始到星期六为一个周期,数字表示依次为:1,2,37;MONTH的表示是从数字0开始,所以月份应该是该数字+1。所以我们在使用的时候一定要仔细的阅读API文档,避免类似的陷阱。 8

5、 Java 软件低级错误(八):序列化类的多版本问题软件低级错误(八):序列化类的多版本问题【解读】Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的Java 软件低级错误文档密级2018-5-25未经许可不得扩散第 3 页, 共 6 页serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。当实现java.io.Serializable接口的实体(类)没有显式地定义serialVersio

6、nUID时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的 class才会生成相同的serialVersionUID 。 9 Java 软件低级错误(九):软件低级错误(九):Java 参数传递:传值还是参数传递:传值还是传引用?传引用?【解读】对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没有改变。对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但

7、是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。10 Java 软件低级错误(十):正确定义软件低级错误(十):正确定义 hashcode【解读】类A覆写了hashCode方法,并采用A的属性value来生成A的hashCode。使用HashSet作为集合对象,把类A的一个对象a加入到HashSet中后,如果对象a的属性value发生了变化,则a的hashCode()方法返回的值也就发生变化,则无法将对象a从HashSet中删除。 11 Java 软件低级错误(十一):正确理解软件低级错误(十一):正确理解 Java 的浅的浅clone 和深和深 clone【

8、解读】浅clone和深clone都是clone,它们本质区别是对象内部的成员属性(非原生类型属性,如int等)在clone时是否处理为引用。如果仍然保留为引用,则称为浅clone,反之称为深clone。浅clone方式得到clone对象即可,深clone方式在得到clone对象后,还需要对引用的成员属Java 软件低级错误文档密级2018-5-25未经许可不得扩散第 4 页, 共 6 页性进行“clone”处理。使用Vector等容器的clone方法一定要注意:对于不变属性可以直接拷贝,对于可变属性需要手动写方法实现深层拷贝防止引用调用。 12 Java 软件低级错误(十二):软件低级错误(十

9、二):Java 的移位(的移位(和和)运算问题)运算问题【解读】运算符指的是对它左边的操作数带符号右移位。我们知道数据的补码表示,如果是负数,那么它的最高位是1,所以右移位操作时左边的空缺用1填补。运算符也是右移,但它与的区别是对于负数,右移不是用1填补,而是用0填补。也就是不考虑数的正负,机械地移位就是了。另外:的左边操作数如果是char,byte,short,运算前会先转换成int,运算结果也就成了int,如果再对运算后的结果int强制类型转换到byte,那它只会机械地截取数据的最右边8位。13 Java 软件低级错误(十三):短路运算和非短路运算的软件低级错误(十三):短路运算和非短路运

10、算的区别区别【解读】逻辑与(&):如果左操作数结果为true,则继续计算右操作数;如果左操作数结果为false,则对右操作数的运算已经没有必要,直接返回结果false,忽略右操作运算。逻辑或(|):如果左操作数结果为false,则继续计算右操作数;如果左操作数结果为true,则对右操作数的运算已经没有必要,直接返回结果true,忽略右操作运算。逻辑与(&)、逻辑或(|):不管左操作数的运算结果如何,都一律计算右边的操作数。14 Java 软件低级错误(十四):定义软件低级错误(十四):定义 equals 方法的同时方法的同时也要定义也要定义 hashCode 方法方法【解读】equals方法用

11、于实现对象之间逻辑上是否相等的判断,而不是判断两个引用是否指向Java 软件低级错误文档密级2018-5-25未经许可不得扩散第 5 页, 共 6 页同一个对象,hashCode用于返回对象的哈希码(也有翻译成散列码的),逻辑上相等(equals比较相等)的两个不同对象它们返回的hashCode值肯定不相等。 Java规范中规定:如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果,所以定义equals的同时一定要定义hashCode,并且要保证equals比较相等的对象,hashCode返回值也必须相同。 15

12、Java 软件低级错误(十五):大小写转换的正确处理软件低级错误(十五):大小写转换的正确处理【解读】String提供有大小写转换方法:String.toUpperCase()和String.toLowerCase(),另外还有带Locale参数的大小写转换方法:String.toUpperCase(Locale locale)和String.toLowerCase(Locale locale)。 String.toUpperCase(Locale locale)和String.toLowerCase(Locale locale)之所以要带Locale参数,就是希望你指定使用的是哪种语言,不带

13、参数的String.toUpperCase()和String.toLowerCase()使用的是系统缺省的语言,例如操作系统的当前语言。有些语言的大小写转换使用了较特殊的规则,甚至不是1:1的字符对应关系,也就是说转换前和转换后的字符串长度不一定相等。 16 Java 软件低级错误(十六):使用包装器对象带来的低软件低级错误(十六):使用包装器对象带来的低效问题效问题【解读】每个基本类型(primitive)都有相应的包装器(wrapper)对象:Integer、Long、Float、Double、Short、Byte、Character和Boolean,我们在使用时不要直接new Integ

14、er对象(这样的做法是低效的),而应该调用包装器对象的valueOf方法。 17 Java 软件低级错误(十七):对于软件低级错误(十七):对于 Map 元素的遍历使元素的遍历使用用 entrySet 还是还是 KeySet?【解读】JDK实现的数据结构中常用的Map有两类:HashMap和TreeMap。keySet和entrySet在Java 软件低级错误文档密级2018-5-25未经许可不得扩散第 6 页, 共 6 页Map元素数较少时(小于10000)在查询速度上的区别不大,它们对于程序性能的影响可以忽略不计。但在元素较多时(大于100000)时entrySet的速度要明显快于keyS

15、et,尤其是TreeMap更明显。 18 Java 软件低级错误(十八):忽略软件低级错误(十八):忽略 InputStream.skip()返回值的处理返回值的处理【解读】java.io.InputStream.skip(long n):跳过和放弃此输入流中的 n 个数据字节,返回的是跳过的实际字节数。如果skip方法的返回值小于要跳过得字节数,则说明有异常发生,此时需要对异常情况进行处理。 19 Java 软件低级错误(十九):静态变量的初始化问题软件低级错误(十九):静态变量的初始化问题【解读】类的一个静态变量已经初始化,在构造函数中进行了重新赋值,但结果显示构造函数中的赋值没有生效。因

16、为编译器是按照顺序将静态对象、静态变量搬到初始化语句块中的,而静态对象的初始化调用了构造方法,在构造方法中先改变了静态变量的值,下面再初始化静态变量时将其值复原了。20 Java 软件低级错误(二十):正确理解软件低级错误(二十):正确理解String/StringBuffer/StringBuilder 的性能区别的性能区别【解读】StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。StringBuilder提供一个与StringBuffer兼容的API,该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号