Java开发常见错误整理

来源:互联网 发布:农村淘宝合伙人费用 编辑:程序博客网 时间:2024/05/18 03:57

做过几年的Java开发,也阅读过一些新手写的Java代码,常常会发现一些Java开发人员经常犯的一些错误,因此将Java开发中常见错误整理如下:

1.NullPointException问题

这种错误恐怕是编程初期最容易犯的错误。 Java是面向对象的语言, 操作几乎都是在对象之间进行的, 一个类的实例如果是空(null)的话则不能调用这个实例的方法, 否则就会出java.lang.NullPointException错误。 最常见的String的操作, 如:
String str = null;
if (str.equals(“Hello”)) {
System.out.println(“str is Hello”);
}
常用的避免方法就是在使用一个Object之前要判断一下是否为null, 除非你确定它肯定是不为null的。所以应该上例修改如下:
String str = null;
if (str !=null && str.equals(“Hello”)) {
System.out.println(“str is Hello”);
}
对于String的这种equals或equalsIgnoreCase的操作常常还可以用下面的方法进行安全操作:
String str = null;
if (“Hello”.equals(str)) {
System.out.println(“str is Hello”);
}
用一个确定的不为null的String去与未知的String进行比较。


2.多余处理语句
这种问题当然不只是java才有的, 任何程序都有可能出现多余的垃圾代码, 尽管它的最终结果是正确的, 我们在写程序的时候要尽可能避免这种不必要的处理。
常见的情况有以下几种:

2.1多余的实例构造
声明了一个对象的实例, 有的人喜欢同时new一下,即给它分配了空间, 而在后面并没用到分配的空间, 而是进行了其它的操作,例:
ArrayList resultList = new ArrayList();

try {
resultList = SomeModule.getResultList();
} catch (Exception e) {
return null;
}

resultList在声明的时候同时给它分配了空间, 但在下面却用它指向了另外返回的地址。 虽然在写Java程序的时候我们不用考虑内存的分配等令人头疼的问题, Java有自己的一套内存管理机制, 但Java在对象的构造的时候开销是很大的, 所以诸如此类的浪费效率的处理还是得要注意避免。

2.2循环多余
我们经常会从一个数组或Collection中通过循环来找出一个符合条件的元素进行操作, 而在执行完之后往往会忘记跳出循环体。 例:
String[] week = new String[]{“Sun”, “Mon”, “Tue”, “Wen”, “Thu”, “Fri”, “Sat”};
for (int i = 0; i < week.length; i++) {
if (week.equals(“Tue”)) {
System.out.println(“Tue is found”);
}
}
如果上面这段程序只是找出week中是否有Tue的话,则在找到之后应该跳出循环体, 正确的写法如下:
for (int i = 0; i < week.length; i++) {
if (week.equals(“Tue”)) {
System.out.println(“Tue is found”);
break; (或return)
}
}

循环处理的原则就是在处理完毕的地方跳出。
2.3 重复语句
建议如果有两个或两个以上的地方需要用到相同的程序块代码, 就要考虑到使用函数, 如果一个功能块比较独立, 有可能在其它被调用, 这个时候也尽可能的使用方法独立开来。
还有种情况就是在条件分支语句里面, 各个分支都需要执行某个相同的语句, 这个时候就需要提到分支的外面去执行。

3.数组和集合的使用问题

3.1数组下标越界的问题;
  现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。

3.2 不能合理的使用集合的问题;
  不清除List、Set和Map等集合的区别,该使用Set集合的时候使用List;不知道集合的合适的使用场合的问题。

4.资源不释放的问题
  IO操作要注意,打开记得要关闭。数据库资源和网络接等资源也是同样的道理。打开的资源连接记得要关闭。

5.语句冗余的问题
  “简练是良好的写作风格”,写文章如此,写代码也是如此。因为简练的代码一般有三个好处:1.节省你的编写时间;2.节省维护者的阅读时间;3.提高代码的运行效率。
 例如:params.put("status", new Integer(Status.DELETED.getValue()));
 改进:该语句应该充分使用Java的自动包装功能。不要去new Integer 对象,因为这样既有代码冗余,又会重复的构造对象,降低程序的运行效率。
 
 例如:if (isAdmin == true) {
            this.appserviceService.deleteAdminApp(id);
        }

    可以简化为if (isAdmin) {
            this.appserviceService.deleteAdminApp(id);
        }

6.使用被废弃的方法的问题
  一般API中废弃的方法一定是存在着某种问题所以应该尽量避免使用。
   例如:if (date.getYear() > value.getYear()) {  ...     }

   此处Date对象的getYear()的方法被废弃了。应该使用Calendar.get(Calendar.YEAR)去代替;


7.代码凌乱的问题
  
  代码是思路的表达,编程首先应该整理思路,编码也像写文章一样,应该条理清晰,段落分明。按照解决问题的步骤去分段写代码,每段代码的功能应该很明确。该写成独立方法的要使用独立的方法去实现。

8.不能充分使用Java5的新特性的问题
  应该充分的使用Java5的Autoboxing/Unboxing功能,Generics(泛型),Varargs(可变参数)等功能来编写代码,从而使用代码更加简洁和健壮。

9.对常用的API不熟悉的问题
  “Don't Reinvent the Wheel”--不要重复发明轮子,要熟悉jdk和apache常用包的API,没有充足的理由就不要去写别人已经写过的方法。“君子善假于物也”,熟悉常用的API,熟练的去使用它们吧!

10.不必要的类型转化的问题
   也许是对字符串类型过于热爱的缘故吧,经常发现有些代码原本可以使用Integer或者Date类型去做的事情,有些工程师却热衷于将其转化为字符串类型,需要知道类型转化是需要付出额外的时间成本的。这样的代码既啰嗦又影响代码的效率。

11.代码注释的问题
   注释代码时,要考虑到不仅将来维护你代码的开发人员要看,而且你自己也可能要看。用Phil Haack大师的话来说就是:“一旦一行代码显示屏幕上,你也就成了这段代码的维护者”。因此,对于我们写得好(差)的注释而言,我们将是第一个受益者(受害者)。
   注释的黄金规则:易读的代码,人性化的去书写代码。这个很重要。写代码要对自己负责,对维护者负责。
  
   对每个方法都要说明:功能、每个参数的意义,参数可以取哪些值,返回值有哪些,在什么情况下返回什么值。对每个源文件都要在开头以注释的方式说明它的作用。

   还有的注释是无用,这样的注释也不应该出现,不要侮辱阅读代码者的智商如: 
    
    if (a == 5)      // if a equals 5
    counter = 0; // set the counter to zero

   这样显而易见的注释就不需要写了,写这些无用的注释只会会浪费你的时间,并将转移读者对该代码细节的理解。
  

12.代码格式的问题
   尽量遵照规范去格式化代码,该换行的换行,该空格的空格,该缩进需要缩进,以提高代码的可读性。

13.命名规范的问题

 命名规范使程序更易读,从而更易于理解。它们也可以提供一些有关标识符功能的信息,以助于理解代码,例如,不论它是一个常量,包,还是类。Java语言中包、类、方法、变量和常量都有其命名规范。在Java语言命名规范网上有很多很好的文章,这里就不再赘述。
  
以上是本人整理的Java开发中的常见问题(其中有些问题也适用其它开发语言),欢迎大家参与讨论,提出自己的看法,或者发表自己的见解。

原创粉丝点击