a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 148|回复: 2

[专业语言] JAVA认证:Java代码常见的十种错误分析

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
每一个程序员在编写代码的过程中都免不了出现错误或是小的失误,这些小的错误和失误往往使得程序员还得返工。那么,如何才能尽量避免这些错误的发生呢?笔者总结只有在日常的编写代码中总结出经验,在这篇文章中,笔者列出了10个Java编程中常见的错误,你可以把这些错误添加到你的代码审查的检查列表中,这样在经过代码审查后,你可以确信你的代码中不再存在这类错误了。
! Y8 X% W* \- S1 d, E# g) ~    一、常见错误1:多次拷贝字符串
: g3 D/ \" L$ g    测试所不能发现的一个错误是生成不可变(immutable)对象的多份拷贝。不可变对象是不可改变的,因此不需要拷贝它。最常用的不可变对象是String。6 t( g+ P) {7 P) I+ k. E% ?. @% m8 e+ ]
    如果你必须改变一个String对象的内容,你应该使用StringBuffer。下面的代码会正常工作:8 x8 O7 [  Y3 H5 F- n! f' E
    String s = new String ("Text here");! a2 H; Q, P1 g8 V$ i( i
    但是,这段代码性能差,而且没有必要这么复杂。你还可以用以下的方式来重写上面的代码:
- P$ j6 O  F* S& P7 v    String temp = "Text here";  String s = new String (temp);
  ]0 K$ k: J: V1 a    但是这段代码包含额外的String,并非完全必要。更好的代码为:% _5 U" t7 h9 e/ y
    String s = "Text here";  二、常见错误2:没有克隆(clone)返回的对象" z/ N9 e: p3 R5 h- [# e
    封装(encapsulation)是面向对象编程的重要概念。不幸的是,Java为不小心打破封装提供了方便Java允许返回私有数据的引用(reference)。下面的代码揭示了这一点:2 G: i2 M# o& ]
    import java.awt.Dimension;4 C+ \5 J/ x) ?$ P- A: [
    /** *//***Example class.The x and y values should never*be negative.*/
- R+ s% q2 A6 s$ n1 Q" M7 z$ m2 m0 w    public class Example…{+ x7 F. e$ Z/ {) {/ s
    private Dimension d = new Dimension (0, 0);
5 L, ?0 [5 D: p+ j1 w; S    public Example ()…{ }
; j: f* @  `4 H  t    /** *//*** Set border="1" Height and width. Both border="1" Height and width must be nonnegative * or an exception is thrown.*/
5 D2 R. `" I) p* K' ~0 q/ @    public synchronized void setValues (int border="1" Height,int width) throws IllegalArgumentException…{
, n; w; i( }9 N& r    if (border="1" Height
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:45 | 显示全部楼层

JAVA认证:Java代码常见的十种错误分析

这段代码是安全的,但是就象在错误1#那样,又作了多余的工作。Integer对象,就象String对象那样,一旦被创建就是不可变的。因此,返回内部Integer对象,而不是它的拷贝,也是安全的。* K, |6 E8 k+ G5 ?
    方法getValue()应该被写为:
5 b, g' i4 k# _: |* l$ O4 L    public synchronized Integer getValue()…{
9 S4 r; d2 g7 b! f( p$ O2 A, g: M    // "i" is immutable, so it is safe to return it instead of a copy.
) f/ w) X  |  M' l. j* o$ \    return i;  }- \& {( j: J, i; H8 S: k3 g8 G
    Java程序比C++程序包含更多的不可变对象。JDK 所提供的若干不可变类包括:! R2 {0 o3 l1 O+ d( A- A% q
    ·Boolean
7 e  ^: [% {* O) c  x) W    ·Byte
& F8 x0 x: X2 o    ·Character
; ]- @: y4 k& ?    ·Class
1 B% h5 M# {4 v1 c; m9 G    ·Double( i6 z8 B) C* i
    ·Float
' ~4 t2 O- O* c7 c    ·Integer' z8 C$ `+ ~' k/ o
    ·Long
0 ]- j, c! [& v8 g, |" `    ·Short3 H* M. d7 [" k  B) n9 h! x) @
    ·String  ·大部分的Exception的子类  四、常见错误4:自编代码来拷贝数组
4 B2 s4 [6 V0 n0 p    Java允许你克隆数组,但是开发者通常会错误地编写如下的代码,问题在于如下的循环用三行做的事情,如果采用Object的clone方法用一行就可以完成:
5 J' i+ |( F) j, P0 p7 j% i    public class Example…{
- O% r" W# c  [0 n6 s    private int[] copy;
* Y# V! R3 Y' I* p" h! u+ O    /** *//*** Save a copy of "data". "data" cannot be null.*/' R: I0 x2 m* ?: p% n% {
    public void saveCopy (int[] data)…{0 \3 J+ X: r' @1 C4 O; w/ q
    copy = new int[data.length];
; K, e+ k# ?3 k, a    for (int i = 0; i* Z* q; ~% U1 ~0 }6 W" F1 j
    copy = data;
- V8 t1 y' ?# J9 L  I) B    }  }
' K' F$ L) V9 T8 N    这段代码是正确的,但却不必要地复杂。saveCopy()的一个更好的实现是:
, Q" h4 M, n4 {  P    void saveCopy (int[] data)…{8 U1 ~% c: j% i* v
    try…{: L: l  B, W. J1 j
    copy = (int[])data.clone();; k- q7 h0 }. ^" C
    }catch (CloneNotSupportedException e)…{; _* T( ?  g+ C* X1 u: ?
    // Can"t get here.& _1 @$ s. M; e
    }  }
2 U$ |% g7 v# @- x, P( O; ~    如果你经常克隆数组,编写如下的一个工具方法会是个好主意:4 q: o$ ?( z  C* `, y
    static int[] cloneArray (int[] data)…{
, j7 j( a; u. C0 o6 f. e+ s- m    try…{* S4 L9 z2 C9 n
    return(int[])data.clone();7 T/ ?# G, a& Y6 K
    }catch(CloneNotSupportedException e)…{
+ h' P7 R; _4 J6 I    // Can"t get here.; ~* X. c/ ^+ W1 y
    }  }
; r4 L7 y0 s/ E% j    这样的话,我们的saveCopy看起来就更简洁了:1 l2 b( N- X( q6 x* h6 v
    void saveCopy (int[] data)…{* v. z- o9 f" ?9 q
    copy = cloneArray ( data);  }  五、常见错误5:拷贝错误的数据" ]6 S0 ?5 u$ t, t2 r" g
    有时候程序员知道必须返回一个拷贝,但是却不小心拷贝了错误的数据。由于仅仅做了部分的数据拷贝工作,下面的代码与程序员的意图有偏差:
/ L; f3 ^8 _0 Q% @    import java.awt.Dimension;
& q' G; f5 a6 G) C" T) e# A0 j  q, }    /** *//*** Example class. The border="1" Height and width values should never * be
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:46 | 显示全部楼层

JAVA认证:Java代码常见的十种错误分析

negative. */
, R, B9 r( |% {8 g& @! ^    public class Example…{
; p. `5 X2 r- X7 t8 H" z3 u    static final public int TOTAL_VALUES = 10;
; L+ F- d# _, }/ r    private Dimension[] d = new Dimension[TOTAL_VALUES];
4 |, D( A6 v- \$ A$ c' b    public Example ()…{ }
+ _. C0 t$ }3 Q. L9 ]! I    /** *//*** Set border="1" Height and width. Both border="1" Height and width must be nonnegative * or an exception will be thrown. */. |: [' l) u/ X6 O- ~
    public synchronized void setValues (int index, int border="1" Height, int width) throws IllegalArgumentException…{
3 t* e1 k; a' ^$ c7 T- ?+ ]& S& u    if (border="1" Height
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-6 22:33 , Processed in 0.188234 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表