java开发注意事项培训.ppt

上传人:wuy****n92 文档编号:70799296 上传时间:2023-01-28 格式:PPT 页数:18 大小:321.49KB
返回 下载 相关 举报
java开发注意事项培训.ppt_第1页
第1页 / 共18页
java开发注意事项培训.ppt_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《java开发注意事项培训.ppt》由会员分享,可在线阅读,更多相关《java开发注意事项培训.ppt(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Copyright 2008Java开发注意事项培训教材2009年1月13日2www.FCopyright 2008 All right reserved,Fiberhomeconfidential代码检查n代码审查对消除一些特别细节的错误大有裨益,代码审查对消除一些特别细节的错误大有裨益,尤其是那些能够容易在阅读代码的时候尤其是那些能够容易在阅读代码的时候发现发现的错的错误,这些错误往往不容易通过机器上的测试识别误,这些错误往往不容易通过机器上的测试识别出来。通常给别人的工作挑错要比找自己的错容出来。通常给别人的工作挑错要比找自己的错容易些。别样视角的存在也解释了为什么作者需要易些。别样视角

2、的存在也解释了为什么作者需要编辑,而运动员需要教练的原因。编辑,而运动员需要教练的原因。n如果审查者能够有意识地寻找特定的错误,而不如果审查者能够有意识地寻找特定的错误,而不是靠漫无目的的浏览代码来发现错误,那么代码是靠漫无目的的浏览代码来发现错误,那么代码审查的效果会事半功倍。审查的效果会事半功倍。3www.FCopyright 2008 All right reserved,Fiberhomeconfidential不当代码n代码格式问题:n 1)空行是否得体?n 2)代码行内的空格是否得体?n 3)注释是否清晰并且必要?n 4)长行拆分是否得体?n 5)If、for、while、do等语

3、句自占一行,不论执行语句多少都要加“”。n 6)标识符的长度应当符合“min-length&max-information”原则?n 7)是否编写太复杂或者多用途的复合表达式?n 8)Case语句的结尾是否忘了加break?n 9)构造函数中是否遗漏了某些初始化工作?4www.FCopyright 2008 All right reserved,Fiberhomeconfidential不当代码n是否违背了继承和组合的规则?n(1)若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。n(2)若在逻辑上A是B的“一部分”(a part of),则不允许

4、B从A派生,而是要用A和其它东西组合出B。5www.FCopyright 2008 All right reserved,Fiberhomeconfidential不当代码n变量值问题:n()变量的初始化或缺省值有错误吗?n()变量发生上溢或下溢吗?n()变量的精度够吗?n逻辑判断问题:n()由于精度原因导致比较无效吗?n()表达式中的优先级有误吗?n()逻辑判断结果颠倒吗?n循环问题:n()循环终止条件不正确吗?n()无法正常终止(死循环)吗?n()错误地修改循环变量吗?n()存在误差累积吗?6www.FCopyright 2008 All right reserved,Fiberhomec

5、onfidential不当代码nException处理问题:n()忘记进行错误处理吗?n()错误处理程序块一直没有机会被运行?n()错误处理程序块本身就有毛病吗?如报告的错误与实际错误不一致,处理方式不正确等等。n()错误处理程序块是“马后炮”吗?如在被它被调用之前软件已经出错。n文件I/O问题:n()对不存在的或者错误的文件进行操作吗?n()文件以不正确的方式打开吗?n()文件结束判断不正确吗?n()没有正确地关闭文件吗?7www.FCopyright 2008 All right reserved,Fiberhomeconfidential不当代码n内存和资源操作问题:n 1)是否一次申请

6、了太大的内存,例如一次性将大型文件读出而不是进行流式处理n 2)是否向全局集合变量(例如会话数据,Map表)添加数据,而忘记移除n 3)是否长期持有大型对象的引用n 4)建立tcp连接,而不进行关闭n 5)使用JDBC访问数据库,忘记关闭statmentn 6)自己使用JDBC连接,而不是使用系统的连接池n 7)创建过多的线程,或者线程式的定时器,例如jdk自带的定时器。n跨平台问题:n 1)是否将代码限制在某个操作系统,例如定义的路径格式为windows系统n 2)调用某个特定的操作系统的命令或程序,导致在其他操作系统上功能失效8www.FCopyright 2008 All right r

7、eserved,Fiberhomeconfidential常见不当代码n多次拷贝字符串生成不可变(immutable)对象的多份拷贝。不可变对象是不可改变的,因此不需要拷贝它。最常用的不可变对象是String。如果你必须改变一个String对象的内容,你应该使用StringBuffer。9www.FCopyright 2008 All right reserved,Fiberhomeconfidential常见不当代码n没有克隆(clone)返回的对象 n不必要的克隆不必要的克隆 n自编代码来拷贝数组 n拷贝错误的数据 n有时候程序员知道必须返回一个拷贝,但是却不小心拷贝了错误的数据。由于仅仅

8、做了部分的数据拷贝工作,代码与程序员的意图有偏差 n检查new 操作的结果是否为null 10www.FCopyright 2008 All right reserved,Fiberhomeconfidential常见不当代码n用=替代.equals n混淆原子操作和非原子操作。Java保证读和写32位数或者更小的值是原子操作,也就是说可以在一步完成,因而不可能被打断,因此这样的读和写不需要同步。不过,这个保证仅限于读和写(get,set)n在catch 块中作清除工作.代码仅仅处理了Exception,而没有涉及到Error。当try块运行出现了Error,流也应该被关闭 11www.FCo

9、pyright 2008 All right reserved,Fiberhomeconfidential常见不当代码n增加不必要的catch 块.增加不必要的catch块的代码:捕获到的异常又立即被抛出 n没有正确实现equals,hashCode,或者clone 等方法。方法equals,hashCode,和clone 由提供的缺省实现是正确的。不幸地是,这些缺省实现在大部分时候毫无用处,因此许多类覆盖其中的若干个方法以提供更有用的功能。但是,问题又来了,当继承一个覆盖了若干个这些方法的父类的时候,子类通常也需要覆盖这些方法。在进行代码审查时,应该确保如果父类实现了equals,hashC

10、ode,或者clone等方法,那么子类也必须正确。正确的实现equals,hashCode,和clone需要一些技巧。12www.FCopyright 2008 All right reserved,FiberhomeconfidentialJava内存泄露n内存的泄漏指的是内存的一块区域一直没有被释放,当这样的区域越来越多时,系统就会崩溃。n尽管java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况。的确,在大型工程中,内存泄漏是一个普遍问题。最常见的折磨着企业级应用程序的错误之一是让人恐惧的outofmemoryError(内存溢出错误)n这个错

11、误引起下面这些典型的症状:n-应用服务器崩溃 n-性能下降 n-jvm重复不断的执行垃圾收集,导致程序停止运行,应用服务器崩溃13www.FCopyright 2008 All right reserved,Fiberhomeconfidential为什么存在内存泄露为什么存在内存泄露n在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图 中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄 漏,这些对象不会被GC所回收,然而它却占用内存。n导致内存泄

12、漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器验证这些对象是否不再需要。14www.FCopyright 2008 All right reserved,Fiberhomeconfidential典型内存泄漏 n全局集合 n下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本 身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单

13、的 方法就是将Vector对象设置为null。nVector v=new Vector(10);nfor(int i=1;i10000000;i+)nnObject o=new Object();nv.add(o);no=null;nn/此时,所有的Object对象都没有被释放,因为变量v引用这些对象。15www.FCopyright 2008 All right reserved,Fiberhomeconfidential典型内存泄漏n高速缓存 n高速缓存是一种用来快速查找已经执行过的操作结果的数据结构。因此,如果一个操作执行很慢的话,你可以先把普通输入的数据放入高速缓存,然后过些时间再调用

14、高速缓存中的数据。n高速缓存多少还有一点动态实现的意思,当数据操作完毕,又被送入高速缓存。一个典型的算法如下所示:n1 检查结果是否在高速缓存中,存在则返回结果;n2 如果结果不在,那么计算结果;n3 将结果放入高速缓存,以备将来的操作调用。n这个算法的问题(或者说潜在的内存泄漏)在最后一步。如果操作是分别多次输入,那么存入高速缓存的内容将会非常大。很明显这个方法不可取。n为了避免这种潜在的致命错误设计,程序就必须确定高速缓存在他所使用的内存中有一个上界。因此,更好的算法是:n1 检查结果是否在高速缓存中,存在则返回结果;n2 如果结果不在,那么计算结果;n3 如果高速缓存所占空间过大,移除缓

15、存中旧的结果;n4 将结果放入高速缓存,以备将来的操作调用。16www.FCopyright 2008 All right reserved,Fiberhomeconfidential典型内存泄漏njni内存泄露内存泄露n如如果果调调用用了了本本地地库库,本本地地库库中中的的内内存存泄泄露露也也会会引引起内存泄露。起内存泄露。17www.FCopyright 2008 All right reserved,Fiberhomeconfidential典型内存泄漏和不当代码n除了上述典型的内存泄露情况外,资源泄露也可能引发内存泄露:n打开文件,而不进行关闭n建立tcp连接,而不进行关闭n使用JDBC访问数据库,忘记关闭statment,connection(或未归还连接到连接池)n创建资源句柄,忘记关闭。n创建过多的线程,或者线程式的定时器,例如jdk自带的定时器。n读写一个大型文件,在内存开辟巨型的byte数组 Copyright 2008欢迎指正

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁