ÎҵĵØÅÌÎÒ×öÖ÷£¡ ²©¿Í£ºhttp://tester2test.cnblogs.com/ ¡¡ msn:win_soft@163.com

Java´úÂëȱÏÝ×Ô¶¯·ÖÎö¹¤¾ß½éÉÜ

ÉÏһƪ / ÏÂһƪ  2007-06-07 14:30:40 / ¸öÈË·ÖÀࣺÆäËû

 

Java´úÂëȱÏÝ×Ô¶¯·ÖÎö¹¤¾ß½éÉÜ

4c~dm!u}6O/sR0

l)fHqT0GP0                                                                                                    »ÆÎý²¨51TestingÈí¼þ²âÊÔÍø{5N lj)A \ u

51TestingÈí¼þ²âÊÔÍø1Wm:j6VVF^7M

Java´úÂëȱÏÝ×Ô¶¯·ÖÎö¹¤¾ßÖ÷ÒªÓУºFindbugs¡¢PMDºÍCheckStyle¹¤¾ß¡£ÕâÀïÖصã½éÉÜFindbugsµÄʹÓ㬼òÒªÌá¼°PMDºÍCheckStyle¹¤¾ßµÄʹÓá£51TestingÈí¼þ²âÊÔÍø?Bat(L&@/]

1         FindBugsÊÇʲô£¿

51TestingÈí¼þ²âÊÔÍøf&O \ R1v Os

FindBugs ÊÇÒ»¸öjava bytecode¾²Ì¬·ÖÎö¹¤¾ß£¬Ëü¿ÉÒÔ°ïÖújava¹¤³ÌʦÌá¸ß´úÂëÖÊÁ¿ÒÔ¼°ÅųýÒþº¬µÄȱÏÝ¡£

{+`.q A2U7\$Z2oW?0J E0 51TestingÈí¼þ²âÊÔÍø~6R)p#v*gwQ

FindBugs¼ì²éÀà»òÕß JAR Îļþ£¬½«×Ö½ÚÂëÓëÒ»×éȱÏÝģʽ½øÐжԱÈÒÔ·¢ÏÖ¿ÉÄܵÄÎÊÌâ¡£51TestingÈí¼þ²âÊÔÍøR$U!`iA6t4A"Zx

L*tCs'Rs'E$~}0ÓÐÁ˾²Ì¬·ÖÎö¹¤¾ß£¬¾Í¿ÉÒÔÔÚ²»Êµ¼ÊÔËÐгÌÐòµÄÇé¿ö¶ÔÈí¼þ½øÐзÖÎö¡£FindBugs²»ÊÇͨ¹ý·ÖÎöÀàÎļþµÄÐÎʽ»ò½á¹¹À´È·¶¨³ÌÐòµÄÒâͼ£¬¶øÊÇͨ³£Ê¹Óà Visitor ģʽ½øÐзÖÎö£¨Visitor ģʽµÄ¸ü¶àÐÅÏ¢£©¡£51TestingÈí¼þ²âÊÔÍø:mGley:p K @

51TestingÈí¼þ²âÊÔÍø x$a3[B F3Q q

 

&@H ndUpdb!PR1[0

2         FindBugs¿ÉÒÔ×öʲô£¿

51TestingÈí¼þ²âÊÔÍø~ bO3l1VBSBS

FindBugsÌṩÁË35¸ö¼ì²âÆ÷À´¼ì²â×Ö½ÚÂëÖпÉÄܵÄȱÏÝ¡£¿ÉÒÔ×öµÄÊÂÇéÖ÷ÒªÓУº

}e0L#v!Z0

2.1       ÕÒ³ö hash equals ²»Æ¥Åä

h,Vldf*`*cA T0ÕÒÓë equals() ºÍ hashCode() µÄʵÏÖÏà¹ØµÄ¼¸¸öÎÊÌâ¡£ÕâÁ½¸ö·½·¨·Ç³£ÖØÒª£¬ÒòΪ¼¸ºõËùÓлùÓÚ¼¯ºÏµÄÀà---List¡¢Map¡¢Set µÈ¶¼µ÷ÓÃËüÃÇ¡£Ò»°ãÀ´Ëµ£¬Õâ¸ö¼ì²âÆ÷Ñ°ÕÒÁ½ÖÖ²»Í¬ÀàÐ͵ÄÎÊÌâ:

)Xu M/V/] U XQ5EQ0 51TestingÈí¼þ²âÊÔÍø N*k:P%zDh\

¢Ùµ±Ò»¸öÀàÖØд¶ÔÏóµÄ equals() ·½·¨£¬µ«ÊÇûÓÐÖØдËüµÄ hashCode ·½·¨£¬»òÕßÏà·´µÄÇé¿öʱ¡£ 51TestingÈí¼þ²âÊÔÍø4nm aHz$l

:[7Xr9z ]V0¢Ú¶¨ÒåÒ»¸ö co-variant °æ±¾µÄ equals() »ò compareTo() ·½·¨¡£ÀýÈ磬 Bob ÀඨÒåÆä equals() ·½·¨Îª²¼¶û equals(Bob) £¬Ëü¸²¸ÇÁ˶ÔÏóÖж¨ÒåµÄ equals() ·½·¨¡£ÒòΪ Java ´úÂëÔÚ±àÒëʱ½âÎöÖØÔØ·½·¨µÄ·½Ê½£¬ÔÚÔËÐÐʱʹÓõļ¸ºõ×ÜÊÇÔÚ¶ÔÏóÖж¨ÒåµÄÕâ¸ö°æ±¾µÄ·½·¨£¬¶ø²»ÊÇÔÚ Bob Öж¨ÒåµÄÄÇÒ»¸ö£¨³ý·ÇÏÔʽ½« equals() ·½·¨µÄ²ÎÊýÇ¿ÖÆת»»Îª Bob ÀàÐÍ£©¡£Òò´Ë£¬µ±Õâ¸öÀàµÄÒ»¸öʵÀý·ÅÈëµ½À༯ºÏÖеÄÈκÎÒ»¸öÖÐʱ£¬Ê¹ÓõÄÊÇ Object.equals() °æ±¾µÄ·½·¨£¬¶ø²»ÊÇÔÚ Bob Öж¨ÒåµÄ°æ±¾¡£ÔÚÕâÖÖÇé¿öÏ£¬ Bob ÀàÓ¦µ±¶¨ÒåÒ»¸ö½ÓÊÜÀàÐÍΪ Object µÄ²ÎÊýµÄ equals() ·½·¨¡£

L3r"Ocx,Wn0

7~(iHf`Z)jv0 

v5k5x^4z/a;G2K0

2.2       ¼ì²â£ººöÂÔ·½·¨·µ»ØÖµ

51TestingÈí¼þ²âÊÔÍø_,|4W7["ALP Li;k

Õâ¸ö¼ì²âÆ÷²éÕÒ´úÂëÖкöÂÔÁ˲»Ó¦¸ÃºöÂԵķ½·¨·µ»ØÖµµÄµØ·½¡£ÕâÖÖÇé¿öµÄÒ»¸ö³£¼ûÀý×ÓÊÇÔÚµ÷Óà String ·½·¨Ê±£¬ÀýÈç:

#mW_^(w_+hK|0

-u,SoO/G [5l01 String aString = "bob";

U'E {'HD'{J/f c3KS;L0

7eEW@ y([E;}02 b.replace('b', 'p');51TestingÈí¼þ²âÊÔÍø| t8{b2BO'K

51TestingÈí¼þ²âÊÔÍøK/T6{XQ

3 if(b.equals("pop"))

3B#T%~|[2k0 51TestingÈí¼þ²âÊÔÍø*rq3B7rt V5V O;o$YS

Õâ¸ö´íÎóºÜ³£¼û¡£ÔÚµÚ 2 ÐУ¬³ÌÐòÔ±ÈÏΪËûÒѾ­Óà p Ìæ»»ÁË×Ö·û´®ÖеÄËùÓÐ b¡£È·ÊµÊÇÕâÑù£¬µ«ÊÇËûÍü¼ÇÁË×Ö·û´®ÊDz»¿É±äµÄ¡£ËùÓÐÕâÀà·½·¨¶¼·µ»ØÒ»¸öÐÂ×Ö·û´®£¬¶ø´ÓÀ´²»»á¸Ä±äÏûÏ¢µÄ½ÓÊÕÕß¡£

'E&jXo bx/_;x#NK0

-? MK{\X&m"F7n0 51TestingÈí¼þ²âÊÔÍøy3kvkh k

2.3       ¼ì²â£ºNull Ö¸Õë¶Ô null µÄ½âÒýÓã¨dereference£©ºÍÈßÓà±È½Ï

Pc3`uN$D0Õâ¸ö¼ì²âÆ÷²éÕÒÁ½ÀàÎÊÌâ¡£Ëü²éÕÒ´úÂë·¾¶½«»á»òÕß¿ÉÄÜÔì³É null Ö¸ÕëÒì³£µÄÇé¿ö£¬Ëü»¹²éÕÒ¶Ô null µÄÈßÓà±È½ÏµÄÇé¿ö¡£ÀýÈ磬Èç¹ûÁ½¸ö±È½ÏÖµ¶¼Îª null£¬ÄÇôËüÃǾÍÊÇÈßÓàµÄ²¢¿ÉÄܱíÃ÷´úÂë´íÎó¡£FindBugs ÔÚ¿ÉÒÔÈ·¶¨Ò»¸öֵΪ null ¶øÁíÒ»¸öÖµ²»Îª null ʱ£¬¼ì²âÀàËƵĴíÎó£¬ÀýÈ磺 51TestingÈí¼þ²âÊÔÍø [Wmw7gsjICv!Ov

4o b:v hg4xO01 Person person = aMap.get("bob");

&jW t,X R;a0

i)c@8R~ V02 if (person != null) {51TestingÈí¼þ²âÊÔÍø9I`,ie0ik,\v-E+?

51TestingÈí¼þ²âÊÔÍøQ0A7B!| VD

3      person.updateAccessTime();

5@X6L G QW0

q(UeW F;G04 }51TestingÈí¼þ²âÊÔÍø-^O J8K u9Q

51TestingÈí¼þ²âÊÔÍøx a5X3E!c-a

5 String name = person.getName();

g}u;Q~-\"Y0 51TestingÈí¼þ²âÊÔÍø0k5o l"J,J)^P`&D

ÔÚÕâ¸öÀý×ÓÖУ¬Èç¹ûµÚ 1 ÐÐµÄ Map ²»°üÀ¨Ò»¸öÃûΪ“bob”µÄÈË£¬ÄÇôÔÚµÚ 5 ÐÐѯÎÊ person µÄÃû×Öʱ¾Í»á³öÏÖ null Ö¸ÕëÒì³£¡£ÒòΪ FindBugs ²»ÖªµÀ map ÊÇ·ñ°üº¬“bob”£¬ËùÒÔËü½«µÚ 5 Ðбê¼ÇΪ¿ÉÄÜ null Ö¸ÕëÒì³£¡£ 51TestingÈí¼þ²âÊÔÍøAm!N"D5H9] r

51TestingÈí¼þ²âÊÔÍø q Op1B7z;w d

 51TestingÈí¼þ²âÊÔÍøc:mb;Y5A1O,k.w

2.4       ¼ì²â£º³õʼ»¯Ö®Ç°¶ÁÈ¡×Ö¶Î

51TestingÈí¼þ²âÊÔÍøY6C)Y9H3hE

Õâ¸ö¼ì²âÆ÷Ñ°ÕÒÔÚ¹¹Ô캯ÊýÖгõʼ»¯Ö®Ç°±»¶ÁÈ¡µÄ×ֶΡ£Õâ¸ö´íÎóͨ³£ÊÇÓÉʹÓÃ×Ö¶ÎÃû¶ø²»Êǹ¹Ô캯Êý²ÎÊýÒýÆðµÄ£¬ÀýÈçÔÚ¹¹Ô캯ÊýÖжÁȡδ³õʼ»¯µÄ×Ö¶Î:51TestingÈí¼þ²âÊÔÍø;hj$d9xf:c7v0S

51TestingÈí¼þ²âÊÔÍøD.aM ~|[ ]

1 public class Thing {51TestingÈí¼þ²âÊÔÍø\/Me+Jy H j

%?|/Qpd02      private List actions;51TestingÈí¼þ²âÊÔÍø#k!Ej0r#vl$b

GK#v:A-Q/wc03      public Thing(String startingActions) {

F a(A K\|S0

J.Qg"V-j:f)M04       StringTokenizer tokenizer = new StringTokenizer(startingActions);51TestingÈí¼þ²âÊÔÍø t2T MAtOG

[:U @w"by ^.U8jO{B05          while (tokenizer.hasMoreTokens()) {51TestingÈí¼þ²âÊÔÍøCreb;C6e*V/A$l

ZbIt@ S7~ P WO06              actions.add(tokenizer.nextToken());51TestingÈí¼þ²âÊÔÍøo0E\!isd8i

51TestingÈí¼þ²âÊÔÍø/k |o%R"cQ:t

7       }

~"pZOjI0 51TestingÈí¼þ²âÊÔÍø3t O;m(T:k l:hB['Ba

8      }

m\Yp+X4{\)G#_0

}z&U2{G QB~09 }51TestingÈí¼þ²âÊÔÍø5WT'y+`cM#zE

yU@W"l0ÔÚÕâ¸öÀý×ÓÖУ¬µÚ 6 Ðн«²úÉúÒ»¸ö null Ö¸ÕëÒì³££¬ÒòΪ±äÁ¿ actions »¹Ã»Óгõʼ»¯¡£ 51TestingÈí¼þ²âÊÔÍø?8z.[(^!h.h T"?

51TestingÈí¼þ²âÊÔÍøl)E*p)e_3X{t

 51TestingÈí¼þ²âÊÔÍø`/f,LK6@6mhup

2.5       ÃüÃû¼ì²é

J\eKjv`P8_0¶Ô±ê×¼ Java ÃüÁî¹æ·¶µÄ²âÊÔ£º±äÁ¿Ãû³Æ²»Ó¦Ì«¶Ì£»·½·¨Ãû³Æ²»Ó¦¹ý³¤£»ÀàÃû³ÆÓ¦µ±ÒÔСд×Öĸ¿ªÍ·£»·½·¨ºÍ×Ö¶ÎÃûÓ¦µ±ÒÔСд×Öĸ¿ªÍ·£¬µÈµÈ¡£51TestingÈí¼þ²âÊÔÍø_hW;md3?:br

51TestingÈí¼þ²âÊÔÍøO+N Fa$O9P)i%G$v@

 

wsF6[J l;kp0

2.6       δʹÓõĴúÂë¼ì²é

8?0K? I%R3|A$ZUs7E0²éÕÒ´ÓδʹÓõÄ˽ÓÐ×ֶκͱ¾µØ±äÁ¿¡¢Ö´Ðв»µ½µÄÓï¾ä¡¢´Óδµ÷ÓõÄ˽Óз½·¨£¬µÈµÈ¡£51TestingÈí¼þ²âÊÔÍøM1y.aYV(hIY)f

51TestingÈí¼þ²âÊÔÍø[5||1w.n$S

 51TestingÈí¼þ²âÊÔÍø\T$mrI{w#_

2.7       ǶÌ×¼ì²é

51TestingÈí¼þ²âÊÔÍøvG3uJ A"H{

ÀýÈ磺 switch Óï¾äÓ¦µ±ÓÐ default ¿é£¬Ó¦µ±±ÜÃâÉî¶ÈǶÌ×µÄ if ¿é£¬²»Ó¦µ±¸ø²ÎÊýÖØи³Öµ£¬²»Ó¦¸Ã¶Ô double Öµ½øÐÐÏàµÈ±È½Ï¡£

T\/b3`e]4OT8w0 51TestingÈí¼þ²âÊÔÍøfdUc/E~L"]:l

 

$Q7y&P0Sp(D0

2.8       µ¼ÈëÓï¾ä¼ì²é

51TestingÈí¼þ²âÊÔÍø @2G+o| K\3h

¼ì²é import Óï¾äµÄÎÊÌ⣬±ÈÈçͬһ¸öÀà±»µ¼ÈëÁ½´Î»òÕß±»µ¼Èë java.lang µÄÀàÖС£51TestingÈí¼þ²âÊÔÍø L^bniha

*A*_H#J:i1\&B;NI6S;Fm0 51TestingÈí¼þ²âÊÔÍø8g+Hq`jq3M1U

2.9       JUnit ²âÊÔ¼ì²é

51TestingÈí¼þ²âÊÔÍø(_3Lyb9lp:^9O&p+I8A%q

²éÕÒ²âÊÔÓÃÀýºÍ²âÊÔ·½·¨µÄÌض¨ÎÊÌ⣬ÀýÈç·½·¨Ãû³ÆµÄÕýȷƴд£¬ÒÔ¼° suite() ·½·¨ÊDz»ÊÇ static ºÍ public¡£

~ ](g2r1@S;z1D_@0 51TestingÈí¼þ²âÊÔÍø"u;t!? Sm dN a h`#g

 51TestingÈí¼þ²âÊÔÍø_qC[s6Z

2.10   ×Ö·û´®¼ì²é

51TestingÈí¼þ²âÊÔÍø;m K+DF9n*q

ÕÒ³ö´¦Àí×Ö·û´®Ê±Óöµ½µÄ³£¼ûÎÊÌ⣬ÀýÈçÖظ´µÄ×Ö·û´®±êÁ¿£¬µ÷Óà String ¹¹Ô캯Êý£¬¶Ô String ±äÁ¿µ÷Óà toString() ·½·¨¡£

#MB _ k2kY])EA0 51TestingÈí¼þ²âÊÔÍø'Bug l-s uk1HL

 

#k,E-c khj:l0Z/X0

2.11   À¨ºÅ¼ì²é

51TestingÈí¼þ²âÊÔÍøwW OXY QMq0u

¼ì²é for¡¢ if¡¢ while ºÍ else Óï¾äÊÇ·ñʹÓÃÁËÀ¨ºÅ¡£

?2b dPZ"@0

?*P:C0b7f4PtZ!yX0 

:?TTg-F"l7m0

2.12   ´úÂë³ß´ç¼ì²é

1i [5y HPd)qnEg0²âÊÔ¹ý³¤µÄ·½·¨¡¢ÓÐÌ«¶à·½·¨µÄÀàÒÔ¼°Öع¹·½ÃæµÄÀàËÆÎÊÌâ¡£51TestingÈí¼þ²âÊÔÍø1d5`,? R7^j#q

51TestingÈí¼þ²âÊÔÍø!S#\6?x q5QoU

 

6g4Z w;K2MPmi8e0

2.13   ÖսắÊý¼ì²é

O5L|FeA"G qc0ÒòΪÔÚ Java ÓïÑÔÖУ¬ finalize() ·½·¨²»ÊÇÄÇôÆձ飬ËüÃǵÄʹÓùæÔòËäÈ»ºÜÏêϸ£¬µ«ÊÇÈËÃǶÔËüÃÇÏà¶Ô²»ÊǺÜÊìϤ¡£ÕâÀà¼ì²é²éÕÒ finalize() ·½·¨µÄ¸÷ÖÖÎÊÌ⣬ÀýÈç¿ÕµÄÖսắÊý£¬µ÷ÓÃÆäËû·½·¨µÄ finalize() ·½·¨£¬¶Ô finalize() µÄÏÔʽµ÷Ó㬵ȵȡ£

D7y w'R7DZD0 51TestingÈí¼þ²âÊÔÍøNy{ l8B

 51TestingÈí¼þ²âÊÔÍø"wg"kG9r4Pg \.?y

2.14   ¿Ë¡¼ì²é

51TestingÈí¼þ²âÊÔÍø}f8f.Y lV)m

ÓÃÓÚ clone() ·½·¨µÄйæÔò¡£·²ÊÇÖØд clone() ·½·¨µÄÀ඼±ØÐëʵÏÖ Cloneable£¬ clone() ·½·¨Ó¦¸Ãµ÷Óà super.clone()£¬¶ø clone() ·½·¨Ó¦¸ÃÉùÃ÷Å׳ö CloneNotSupportedException Òì³££¬¼´Ê¹Êµ¼ÊÉÏûÓÐÅ׳öÒì³££¬Ò²ÒªÈç´Ë¡£

QZ;|y,Y*D'Yh(y0 51TestingÈí¼þ²âÊÔÍø2Z q/w'UuX

 

'je;P.|;j+fo L%y0

2.15   ñîºÏ¼ì²é

51TestingÈí¼þ²âÊÔÍøk _Gvfl _t0Gz

²éÕÒÀàÖ®¼ä¹ý¶ÈñîºÏµÄ¼£Ï󣬱ÈÈçµ¼ÈëÄÚÈÝÌ«¶à£»ÔÚ³¬ÀàÐÍ»ò½Ó¿Ú¾ÍÒѾ­¹»ÓõÄʱºòʹÓÃ×ÓÀàµÄÀàÐÍ£»ÀàÖеÄ×ֶΡ¢±äÁ¿ºÍ·µ»ØÀàÐ͹ý¶àµÈ¡£51TestingÈí¼þ²âÊÔÍø2V(KL fLnEKM

4[ `1z2H7u7F0 

f5JN5b:bD1Qg#l.Yl0

2.16   Òì³£¼ì²é

Ca:GTAgM:J0Õë¶ÔÒì³£µÄ¼ì²é£º²»Ó¦¸ÃÉùÃ÷¸Ã·½·¨¶øÅ׳ö java.lang.Exception Òì³££¬²»Ó¦µ±½«Òì³£ÓÃÓÚÁ÷¿ØÖÆ£¬²»Ó¦¸Ã²¶»ñ Throwable£¬µÈµÈ¡£

5FGoAy0Tf0 51TestingÈí¼þ²âÊÔÍø8]8wp%I-Uh

 51TestingÈí¼þ²âÊÔÍø7U"L9iZ5\0M3u/j"i)q!f

2.17   ÈÕÖ¾¼ì²é

51TestingÈí¼þ²âÊÔÍø x mjK?5RcG

²éÕÒ java.util.logging.Logger µÄ²»µ±Ê¹Ó㬰üÀ¨·ÇÖÕ״̬£¨nonfinal£©¡¢·Ç¾²Ì¬µÄ¼Ç¼Æ÷£¬ÒÔ¼°ÔÚÒ»¸öÀàÖÐÓжà¸ö¼Ç¼Æ÷¡£51TestingÈí¼þ²âÊÔÍøqX8u2U5WU H

51TestingÈí¼þ²âÊÔÍø+d,K_3?Vf1mA+j*q6RY

 

3v Me/?)O0

2.18   Open€€Close¼ì²é

TQr*A"t0¼ì²éÎļþ»òͨѶ·½Ã棬ÊÇ·ñÍü¼ÇCloseµÄÇé¿ö¡£

[ Z"K)Sv9A5s0

[zr#[,~]0 51TestingÈí¼þ²âÊÔÍø3ve `A%sgX

2.19   ÆäËü¼ì²é

,|!^B@ I6Bh0ÆäËüȱÏÝÇåµ¥¿É²Î¼û£ºÈ±ÏÝÇåµ¥51TestingÈí¼þ²âÊÔÍø3y U!QH rc0U#[!u

51TestingÈí¼þ²âÊÔÍø!v g p\*sP5?

 51TestingÈí¼þ²âÊÔÍø%Cs%|;ldo5R+~

2.20    ¹¹½¨×Ô¼ºµÄ¹æÔò¼¯

M|8L.r/R ov0¿ÉÒÔ¹¹½¨×Ô¼ºµÄ¹æÔò¼¯51TestingÈí¼þ²âÊÔÍø+qe;VTg)L

51TestingÈí¼þ²âÊÔÍøUsN`'e

 

X&ahZ3}A0

3         ×¼±¸Ê¹ÓÃFindBugs

51TestingÈí¼þ²âÊÔÍøQ3\5V"d`6^+r {

FindBugsÄ¿Ç°×îа汾ÊÇ 0.9.3 ¡£ÎļþÃûÊÇ£ºfindbugs-0.9.3.zip£¨Windows£©»òfindbugs-0.9.3.tar.gz£¨Unix£©¡££¨ÏÂÔØÍøÒ³£©

X#f-r:` \+Cz0

0M#t/T)\B9oJ|8K0Ò²¿ÉÒÔµ½StarTeamÈ¡ÏàÓ¦°²×°Îļþµ½±¾µØ£¬½«Ëü½âѹËõµ½ËùÑ¡µÄĿ¼ÖУ¬°²×°¾ÍÍê³ÉÁË¡£

{hDcu5DLO0

b8nI+Bq0ÒªÔËÐÐ FindBugs£¬ÐèÒªÒ»¸ö°æ±¾ 1.4 »òÕ߸ü¸ßµÄ Java Development Kit £¨JDK£©¡£51TestingÈí¼þ²âÊÔÍø$AF${7oGin

:c2@mU_;J0°²×°Íêºó£¬ÒªÔö¼ÓÁ½¸ö»·¾³±äÁ¿£º

Cg$Z6x9n ]7p0 51TestingÈí¼þ²âÊÔÍø-} qLlkPfe$i

FINDBUGS_HOME£¬ÀýÈ磺FINDBUGS_HOME £½D:\findbugs-0.9.351TestingÈí¼þ²âÊÔÍø#@.A%M"E[2qkn

51TestingÈí¼þ²âÊÔÍøt2do2qY7c8P%p

JAVA_HOME£¬ÀýÈ磺JAVA_HOME£½D:\j2sdk1.4.2_0651TestingÈí¼þ²âÊÔÍø J;v#G$P(K/W

51TestingÈí¼þ²âÊÔÍø$jt}*Rr@h-\y:{*ad

 

IP ?h0H.A0a"mO _(C0 51TestingÈí¼þ²âÊÔÍø9R4@^#N ?\ `2x

ÔÚ FindBugs Ö÷Ŀ¼ÖУ¬Óм¸¸öÖµµÃ×¢ÒâµÄĿ¼¡£ÎĵµÔÚ doc Ŀ¼ÖУ¬µ«ÊǶÔÎÒÃÇÀ´Ëµ¸üÖØÒªµÄÊÇbin Ŀ¼£¬¸Ã°üº¬ÁËÔËÐÐ FindBugs µÄÅú´¦ÀíÎļþ¡£51TestingÈí¼þ²âÊÔÍø5y0u Da4eogg1N

T+zc:[1r1tG0 51TestingÈí¼þ²âÊÔÍø@-\$`|m+L(z

4         ÔËÐÐ FindBugs

6dx)g v\"T1JeB0ÏñÈç½ñµÄ´ó¶àÊýÊý¹¤¾ßÒ»Ñù£¬¿ÉÒÔÒÔ¶àÖÖ·½Ê½ÔËÐÐ FindBugs€€€€´Ó GUI¡¢´ÓÃüÁîÐС¢Ê¹Óà Ant¡¢×÷Ϊ Eclipse ²å¼þ³ÌÐòºÍʹÓà Maven¡£51TestingÈí¼þ²âÊÔÍø+FKO:F7r~/e

51TestingÈí¼þ²âÊÔÍø#ump3L^M/K%t ?

ÕâÀォÖصãÌá¼°´Ó GUI ÔËÐÐ FindBugs£¬¼òÒªÌἰʹÓÃAnt ºÍÃüÁîÐÐÔËÐС£

pB c%`#~8F8R.V'Rv{0 51TestingÈí¼þ²âÊÔÍø~~'bov%XPSC4`

 

8O`9si7u&M0

4.1       FindBugs UI

K@Y)S6\:H;^0ʹÓà FindBugs UI ºÜÖ±¹Û¡£Ê¹Óà FindBugs UI µÄÒ»¸öºÃ´¦ÊǶÔÿһ¸ö¼ì²âµ½µÄÎÊÌâÌṩÁË˵Ã÷£¬Í¼ 1 ÏÔʾÁËȱÏÝ TestµÄ˵Ã÷¡£51TestingÈí¼þ²âÊÔÍø3ZO_f'kC7VL"e

*CK#G!| qh%f3]~a0ͼһ£ºÏîÄ¿TestµÄȱÏÝ˵Ã÷51TestingÈí¼þ²âÊÔÍø+U V|Ml(kb ~

s:A`&H!m0 

~!mh-RK;|o_0

_*R#K9j)ls!rK9xs0¶ÔÿһÖÖȱÏÝģʽÌṩÁËÀàËƵÄ˵Ã÷¡£´°¿ÚÏÂÃæµÄ Source code Ñ¡ÏºÜÓÐÓá£Èç¹û¸æËß FindBugs ÔÚʲôµØ·½Ñ°ÕÒ´úÂ룬Ëü¾Í»áÔÚת»»µ½ÏàÓ¦µÄÑ¡Ïʱͻ³öÏÔʾÓÐÎÊÌâµÄÄÇÒ»ÐС£

5{CB Y,m6wQ0 51TestingÈí¼þ²âÊÔÍøZA"_ex n!U

ͼһÖеÄÉϲ¿Óиù¾Ý²»Í¬Àà±ðÀ´¼ì²éȱÏݵÄÑ¡ÏѡÏîÓУ¨By Class¡¢By Package¡¢By Bug Type¡¢By Bug Category£©¡£

6c3^2uoB0 51TestingÈí¼þ²âÊÔÍø J qU1}:P

ͼ¶þÊÇ¡¾file¡¿Ñ¡ÏÖ÷Òª¹¦ÄÜÓУº´´½¨ÐÂÏîÄ¿¡¢´ò¿ª/¹Ø±ÕÏîÄ¿¡¢´¢´æÏîÄ¿¡¢´¢´æBugsÐÅÏ¢¡¢×°ÔØBuugsÐÅÏ¢51TestingÈí¼þ²âÊÔÍøbo j+o2e g9OxXJ

Em$Cm'D+q0 

2k {9Y*r$nO6u0 51TestingÈí¼þ²âÊÔÍø%uWht1vovB

 51TestingÈí¼þ²âÊÔÍø#B @;k9L(c

51TestingÈí¼þ²âÊÔÍø{']%f7ur/oU

ͼÈýÊÇ¡¾View¡¿Ñ¡ÏÕâЩѡÏîºÜÓÐÓ㬿ÉÒÔÇл»²»Í¬Ä£Ê½µÄÊÓͼ¡£

7|0fs6Vu2G/`-W!r6]0 51TestingÈí¼þ²âÊÔÍø,`%wWTD@

 51TestingÈí¼þ²âÊÔÍø&Yk ad6y/\

gim/y'Y6D0 

M7h'{qs0

iq Tw2xr.V0ͼËÄÊÇ¡¾Settings¡¿Ñ¡ÏÊǶԼì²âµÄȱÏÝģʽ½øÐÐÑ¡Ôñ¡£

7lGee3`z0 51TestingÈí¼þ²âÊÔÍøB\h(x(^cM1Fb

 

-C3w"|(Ws c"i6f0 51TestingÈí¼þ²âÊÔÍø } h @$Bk([

 51TestingÈí¼þ²âÊÔÍø;U4Z CF v&CH0n

51TestingÈí¼þ²âÊÔÍø{3J$JBL5n

 51TestingÈí¼þ²âÊÔÍøh8eY FY)v

EZp,J&ApfmJ0ͼÎåÊÇ¡¾´´½¨ÐÂÏîÄ¿¡¿Ñ¡Ïî

I1WO }9g`$q%vU0 51TestingÈí¼þ²âÊÔÍø"o k$\n/H

 

o{.I#Kb0

~0j#@e/m:i9\2]0 51TestingÈí¼þ²âÊÔÍøxu7L6F*y3S n-R

51TestingÈí¼þ²âÊÔÍø^ ~4?K Y4U}jog f

 

:K?(r&t)K&K+\tD0

4.2       ʹÓà FindBugs UI²½Öè

^s K{'V0µÚÒ»´ÎʹÓÃ51TestingÈí¼þ²âÊÔÍøNFSDWw~

51TestingÈí¼þ²âÊÔÍøh(D8F/[X9co

£¨1£©       ÒÀÕÕͼÎ塾´´½¨ÐÂÏîÄ¿¡¿Ñ¡Ïî˵Ã÷£¬ÏÈ´´½¨ÐÂÏîÄ¿£¬ÊäÈë±»¼ì²éµÄclass»òjar·¾¶¡¢javaÔ´Îļþ·¾¶¼°³ÌÐòÔËÐÐÒÀÀµµÄclass»òjar·¾¶51TestingÈí¼þ²âÊÔÍø]"x1a(@8N#[6`/Jn

w7iWt.x~nM1V&U7M0£¨2£©       °´¡¾FingBugs¡¿°´Å¥¿ªÊ¼¼ì²é

9p"a7`1o-EG*}0 51TestingÈí¼þ²âÊÔÍøY Y H G M w%Dk y;Z~

£¨3£©       Èç¹û³öÏÖÏÂͼÁùµÄ¾¯¸æ51TestingÈí¼þ²âÊÔÍø5E]M4p:_,l#_a%M_/e

51TestingÈí¼þ²âÊÔÍø)q$m'DW8w

 51TestingÈí¼þ²âÊÔÍøMM,j/q MJ I

F*g,|2Gd*d^pob0˵Ã÷³ÌÐòÔËÐÐÒÀÀµµÄclass»òjar·¾¶²»¶Ô»òÒÀÀµÎļþ²»ÍêÕû£¬Ó¦ÒÀ¾Ý¾¯¸æÐÅÏ¢ÍêÉÆ¡£51TestingÈí¼þ²âÊÔÍø8Wk)K;H$I)}n"f

51TestingÈí¼þ²âÊÔÍøP1tq)F-[vTW;Rno

£¨4£©       °´¡¾OK¡¿ºó¼´½øÈëÉÏͼһµÄ´íÎóÐÅÏ¢ÏÔʾ51TestingÈí¼þ²âÊÔÍø-m7iM }a'YR `+e |

U6{9V f#W,f0£¨5£©       Ñ¡Ôñ¡¾file¡¿´¢´æн¨µÄÏîÄ¿

;\2X5M zf0 51TestingÈí¼þ²âÊÔÍø u#u-TR[ yON

£¨6£©       Ñ¡Ôñ¡¾file¡¿´¢´æÐÂɨÃèµÄBugsÐÅÏ¢£¨xmlÎļþ£©

{J#B-QTn&ob0 51TestingÈí¼þ²âÊÔÍøA9KqV!f,H6W] w p

 51TestingÈí¼þ²âÊÔÍøtkEL.I-A |

#k$P8J:]V(x y0·ÇµÚÒ»´ÎʹÓÃ51TestingÈí¼þ²âÊÔÍø6q3[@|0G7T'l!hP

51TestingÈí¼þ²âÊÔÍø d|u&QW}n

£¨1£©       Ñ¡Ôñ¡¾file¡¿×°ÔØÉÏ´Îн¨µÄÏîÄ¿²¢ÔËÐÐ51TestingÈí¼þ²âÊÔÍøpkCYty,h{ `(H

51TestingÈí¼þ²âÊÔÍø-r%a4J&f1Fi9S

£¨2£©       Ò²¿ÉÒÔÑ¡Ôñ¡¾file¡¿×°ÔØÉϴδ¢´æµÄBugsÐÅÏ¢À´²é¿´51TestingÈí¼þ²âÊÔÍød SPs Y"Dd@zrN

.RS)K(P#Q Z x [h0 

b.M ^Zpb#Jq0 51TestingÈí¼þ²âÊÔÍø? k-s[(EZY

 

7l([:~2Y3B~:k0

)~H,ljN$L(? Be0F0ÖµµÃÒ»ÌáµÄ»¹ÓÐÔÚ½« FinBugs ×÷Ϊ Ant ÈÎÎñ»òÕßÔÚÃüÁîÐÐÖÐÔËÐÐ FindBugs ʱ£¬Ñ¡Ôñ xml ×÷Ϊ ouput Ñ¡Ï¿ÉÒÔ½«ÉÏÒ»´ÎÔËÐеĽá¹û×°Ôص½ UI ÖС£ÕâÑù×öÊÇͬʱÀûÓûùÓÚÃüÁîÐеŤ¾ßºÍ UI ¹¤¾ßµÄÓŵãµÄÒ»¸öºÜºÃµÄ·½·¨¡£51TestingÈí¼þ²âÊÔÍø tI,AwPU$P^l

51TestingÈí¼þ²âÊÔÍø&U7G4b9a^+X8H*P

 

A`Ka W(l0

4.3       FindBugs ×÷Ϊ Ant ÈÎÎñ

51TestingÈí¼þ²âÊÔÍøQA3X,w`JM

ÈçºÎÔÚ Ant ±àÒë½Å±¾ÖÐʹÓà FindBugs£¿Ê×ÏȽ« FindBugs Ant ÈÎÎñ¿½±´µ½ Ant µÄ lib Ŀ¼ÖУ¬ÕâÑù Ant ¾ÍÖªµÀеÄÈÎÎñ¡£½« FIND_BUGS_HOME\lib\FindBugs-ant.jar ¿½±´µ½ ANT_HOME\lib¡£51TestingÈí¼þ²âÊÔÍø%B4Tf*n-p

51TestingÈí¼þ²âÊÔÍøn,jt0hjE

ÏÖÔÚ¿´¿´ÔÚ±àÒë½Å±¾ÖÐÒª¼ÓÈëʲô²ÅÄÜʹÓà FindBugs ÈÎÎñ¡£ÒòΪ FindBugs ÊÇÒ»¸ö×Ô¶¨ÒåÈÎÎñ£¬½«ÐèҪʹÓà taskdef ÈÎÎñÒÔʹ Ant ÖªµÀ×°ÔØÄÄÒ»¸öÀࡣͨ¹ýÔÚ±àÒëÎļþÖмÓÈëÒÔÏÂÒ»ÐУº51TestingÈí¼þ²âÊÔÍøM!~ j8|7\ |@ V

(Q`S@b3s-E x/T051TestingÈí¼þ²âÊÔÍø ~~}~ _yFA

51TestingÈí¼þ²âÊÔÍø A"~~ K!d l

ÔÚ¶¨ÒåÁË taskdef ºó£¬¿ÉÒÔÓÃËüµÄÃû×Ö FindBugs ÒýÓÃËü¡£ÏÂÒ»²½ÒªÔÚ±àÒëÖмÓÈëʹÓÃÐÂÈÎÎñµÄÄ¿±ê£¬Ê¾ÀýÈçÏ£º51TestingÈí¼þ²âÊÔÍø.k$i#D%w4F0?M

UFk"K}_5`B0

8s*K i w!TC L-U,f2N0 51TestingÈí¼þ²âÊÔÍøQF/D%u_dm

2             51TestingÈí¼þ²âÊÔÍøt?s9H4Mh u^7~

Y#aF'Ni+t;K+J;t0home="${FindBugs.home}" output="xml" outputFile="jedit-output.xml">

pp [&sva,i#jv u0

)W)E/ff*w [03         

T#b@%^$d0w[0 51TestingÈí¼þ²âÊÔÍøTk?5V ^sS

4         

"V9A8]H)Q/Ya O0 51TestingÈí¼þ²âÊÔÍøV[e9kzA2t

5          51TestingÈí¼þ²âÊÔÍø-G/f0P5vrz

51TestingÈí¼þ²âÊÔÍøVEOi d

6      51TestingÈí¼þ²âÊÔÍø B;?K?`o\

p,lO;Fm0

w&y%og\iJa$iq0 51TestingÈí¼þ²âÊÔÍø?(Bu v1J_c d$P

µÚ 1 ÐУº ×¢Òâ target È¡¾öÓÚ±àÒë¡£Ò»¶¨Òª¼Çס´¦ÀíµÄÊÇÀàÎļþ¶ø ²» ÊÇÔ´Îļþ£¬ÕâÑùʹ target ¶ÔÓ¦ÓÚ±àÒëÄ¿±ê±£Ö¤ÁË FindBugs ¿ÉÔÚ×îеÄÀàÎļþÔËÐС£FindBugs ¿ÉÒÔÁé»îµØ½ÓÊܶàÖÖÊäÈ룬°üÀ¨Ò»×éÀàÎļþ¡¢JAR Îļþ¡¢»òÕßÒ»×éĿ¼¡£ 51TestingÈí¼þ²âÊÔÍø ]L1wqB$q R N

A z5B'g+i q0 

dD&y?%?YWcg|0 51TestingÈí¼þ²âÊÔÍø |~.RB5O^1h

µÚ 2 ÐУº±ØÐëÖ¸¶¨°üº¬ FindBugs µÄĿ¼£¬ÎÒÊÇÓà Ant µÄÒ»¸öÊôÐÔÍê³ÉµÄ£¬ÏñÕâÑù£º51TestingÈí¼þ²âÊÔÍøa\Q-r}C

51TestingÈí¼þ²âÊÔÍø6^ Wr"D;Egg

0.7.3" />51TestingÈí¼þ²âÊÔÍø4{t@ ?;sHe1j

51TestingÈí¼þ²âÊÔÍø}#Z(tCV.]7?#]

¿ÉÑ¡ÊôÐÔ output Ö¸¶¨ FindBugs µÄ½á¹ûʹÓõÄÊä³ö¸ñʽ¡£¿ÉÄܵÄÖµÓÐ xml ¡¢ text »òÕß emacs ¡£Èç¹ûûÓÐÖ¸¶¨ outputFile £¬ÄÇô FindBugs »áʹÓñê×¼Êä³ö¡£ÈçÇ°ËùÊö£¬XML ¸ñʽÓпÉÒÔÔÚ UI Öйۿ´µÄ¶îÍâºÃ´¦¡£ 51TestingÈí¼þ²âÊÔÍø^{2?p bPZ

51TestingÈí¼þ²âÊÔÍø7xrz:qv

 

b3m&}+XI Q4W!J0

l%KF$lg3J?0µÚ 3 ÐУº class ÔªËØÓÃÓÚÖ¸¶¨Òª FindBugs ·ÖÎöÄÄЩ JAR¡¢ÀàÎļþ»òÕßĿ¼¡£·ÖÎö¶à¸ö JAR »òÕßÀàÎļþʱ£¬ÒªÎªÃ¿Ò»¸öÎļþÖ¸¶¨Ò»¸öµ¥¶ÀµÄ class ÔªËØ¡£³ý·Ç¼ÓÈëÁË projectFile ÔªËØ£¬·ñÔòÐèÒª class ÔªËØ¡£51TestingÈí¼þ²âÊÔÍø K(\tCAO,@3K

51TestingÈí¼þ²âÊÔÍøQ5Khmix*@~|M

 51TestingÈí¼þ²âÊÔÍøz C]j0l(cU4v ]

51TestingÈí¼þ²âÊÔÍø/i*R4L9H!A*{*s0qP+D0O

µÚ 4 ÐУº ÓÃǶÌ×ÔªËØ auxClasspath ÁгöÓ¦ÓóÌÐòµÄÒÀÀµÐÔ¡£ÕâЩÊÇÓ¦ÓóÌÐòÐèÒªµ«ÊDz»Ï£Íû FindBugs ·ÖÎöµÄÀà¡£Èç¹ûûÓÐÁгöÓ¦ÓóÌÐòµÄÒÀÀµ¹Øϵ£¬ÄÇô FindBugs ÈÔÈ»»á¾¡¿ÉÄܵطÖÎöÀà¡£Óë class ÔªËØÒ»Ñù£¬¿ÉÒÔÔÚ FindBugs ÔªËØÖÐÖ¸¶¨¶à¸ö auxClasspath ÔªËØ¡£ auxClasspath ÔªËØÊÇ¿ÉÑ¡µÄ¡£ 51TestingÈí¼þ²âÊÔÍø Hnt OM'm

51TestingÈí¼þ²âÊÔÍø%j^ dH\vds,l

 51TestingÈí¼þ²âÊÔÍø0wyXx4XF

L7P2[{1U;cU,fE0µÚ 5 ÐУº Èç¹ûÖ¸¶¨ÁË sourcePath ÔªËØ£¬ÄÇô path ÊôÐÔÓ¦µ±±íÃ÷Ò»¸ö°üº¬Ó¦ÓóÌÐòÔ´´úÂëµÄĿ¼¡£Ö¸¶¨Ä¿Â¼Ê¹ FindBugs ¿ÉÒÔÔÚ GUI Öв鿴 XML ½á¹ûʱͻ³öÏÔʾ³ö´íµÄÔ´´úÂë¡£Õâ¸öÔªËØÊÇ¿ÉÑ¡µÄ¡£

Z0a ^JRc0

k2f7}.r9B0 51TestingÈí¼þ²âÊÔÍø5z9wmO8h`

5T[2M I'FDS0 

~,FA6t/Er\&t Q3]0

5         ÆäËü·ÖÎö¹¤¾ß

RkC `*Eq$E#Wo2P0³ýFingBugs¾²Ì¬·ÖÎö¹¤¾ßÍ⣬»¹ÓÐPMDºÍCheckstyle£¬FingBugs¡¢PMDºÍCheckstyleÈý¸ö¹¤¾ß¸÷Óв»Í¬µÄÌص㣬ÁªºÏʹÓÃÓÐÖúÓÚ¼õÉÙÎ󱨴íÎó£¬Ìá¸ß±¨¸æµÄ׼ȷÂÊ¡£51TestingÈí¼þ²âÊÔÍø3c$U#c2R(Bb

%A8sB!_:S{J P$]!O0ÕâÈý¸ö¹¤¾ß¼ì²éµÄ²àÖصã¸÷Óв»Í¬£º

8O"KB@ us0

¹¤¾ß51TestingÈí¼þ²âÊÔÍø/n0Z9]I+f0w.@

Ä¿µÄ

9n"s$R uK0

Ö÷Òª¼ì²éÄÚÈÝ

(A|5O7o&s zB0
51TestingÈí¼þ²âÊÔÍø}i+a7~+e$ks}

FindBugs51TestingÈí¼þ²âÊÔÍø2eUEi };z }s/P;dD

J3[1P ?(gH+V5t'{lm4F0»ùÓÚBug Patterns¸ÅÄ²éÕÒjava bytecodeÖеÄDZÔÚbug¡£ÔÚÄ¿Ç°°æ±¾ÖУ¬Ëü²»¼ì²éjavaÔ´Îļþ¡£51TestingÈí¼þ²âÊÔÍøR%a`Enve

t)tdV,xnzy0Ö÷Òª¼ì²ébytecodeÖеÄbug patterns£¬Ò²ÔÊÐíÓû§×Ô¶¨ÒåÌض¨µÄbug patterns¡£51TestingÈí¼þ²âÊÔÍø QjS^*b*z+L

51TestingÈí¼þ²âÊÔÍø?o4L i {1j.y$F*S

PMD51TestingÈí¼þ²âÊÔÍø |9u(f6W&K%LP,[&Y.\

7Q J#t%p B `f0¼ì²éjavaÔ´ÎļþÖеÄDZÔÚÎÊÌâ¡£51TestingÈí¼þ²âÊÔÍø^i5D `2Wogy

#[*B.O yPo@0Ö÷Òª°üÀ¨£º51TestingÈí¼þ²âÊÔÍø s:f {iFj6zj'fT6hA

0kbO [ |p:M~.VwV#J0  -   ¿Õtry/catch/finally/switchÓï¾ä¿é

-[|1aq]p0

+zZ9kB-O(v"q0 -        δʹÓõľֲ¿±äÁ¿¡¢²ÎÊýºÍprivate·½·¨

roju ^Q0cMa0

)F0q-R&W#@&k[0 -        ¿Õif/whileÓï¾ä

k*D ueS1yt0 51TestingÈí¼þ²âÊÔÍøa CxJ9v"A6@

 -        ¹ýÓÚ¸´Ôӵıí´ïʽ£¬Èç²»±ØÒªµÄifÓï¾äµÈ

dIhAq{.X g(tUGu}0 51TestingÈí¼þ²âÊÔÍø0Bl {wxe

 -        ¸´ÔÓÀà

GLN4K9dH!?j0
51TestingÈí¼þ²âÊÔÍø;zztv.~A

CheckStyle51TestingÈí¼þ²âÊÔÍø'R`fE(C @2Y

51TestingÈí¼þ²âÊÔÍø2kPeUA'?aQ5M Q

¼ì²éjavaÔ´ÎļþÊÇ·ñÓë´úÂë¹æ·¶Ïà·û

"c/B2R'N$c1r5K0
51TestingÈí¼þ²âÊÔÍø+XC%YQ`NK

Ö÷Òª°üÀ¨

:N6e/\"N2Z0 51TestingÈí¼þ²âÊÔÍø`q8?3YnA

 -        Javadoc×¢ÊÍ51TestingÈí¼þ²âÊÔÍøgRE{&e{F6Yr

51TestingÈí¼þ²âÊÔÍø? I1]RBy

 -        ÃüÃû¹æ·¶

I YE(Bh|&~;ghk(}0

2@.j%~*H3[e!E0 -        Headers51TestingÈí¼þ²âÊÔÍø&ET k4t7u+sT2i

51TestingÈí¼þ²âÊÔÍø3T7\EH8z-m3]v%UP

 -        Imports51TestingÈí¼þ²âÊÔÍø9c;S jBBh(c&y\

Js$JqF0 -        Size³åÍ»ºÍ¶ÈÁ¿£¬Èç¹ý³¤µÄ·½·¨51TestingÈí¼þ²âÊÔÍøTL4D,^ | ded m3m `

,O8[$}zhu0 -        Whitespace

(J-F1~m)w`;_(R$}*_Q)x0 51TestingÈí¼þ²âÊÔÍød$W6~1N;]m M7X

 -        Modifiers51TestingÈí¼þ²âÊÔÍøp|[)U]lM

[ [9t S+m`&ulPoO0 -        Blocks

o)h!]9v*By4t+n0

\$Eh(l]0 -        Coding Problems51TestingÈí¼þ²âÊÔÍøCGeD(m

#X:@(}:Z c9S z0 -        Class Design

q |!C1BBO0

y'N;V+`&?%X8AB0 -        Öظ´´úÂë

&y0V-F0A8O Y3u jS0

;|R:h+d({W0 -        Miscellaneous Checks

3P'|9i$zh4i0g$@P:a0 51TestingÈí¼þ²âÊÔÍø&P5|)R~h9_i

 -        Optional Checks

N3p)R-Li Y/k0
51TestingÈí¼þ²âÊÔÍø:t#jW4ug![ [u#E

 

3L#LeTm0 51TestingÈí¼þ²âÊÔÍø.@5[H"k-~a [B

 51TestingÈí¼þ²âÊÔÍøW4u&? Le6gL@O

5.1       PMD¹¤¾ß

51TestingÈí¼þ²âÊÔÍø_1is7b&GJ$b8Ke;cv

PMD¹¤¾ßÄ¿Ç°×îа汾ÊÇV3.3(ÏÂÔØÍøÒ³)¡£

mIr rc:L0

_4O qP9p&tu0PMDµÄÔËÐл·¾³ÊÇj2se1.3»òÒÔºó°æ±¾£¬°²×°¹ý³ÌͬÑùÒ²Êǽâѹ¼´¿É¡£

.Lv+]$ul/A#D `g!D0

5.1.1 Ant taskµÄʹÓÃ

$t ]2l8}niC0mE"{0£¨1£©       °ÑlibÖÐËùÓеÄjar¸´ÖƵ½ÏîÄ¿µÄclasspathÖС£

&C8^P:yjk#F5i8R0

#}1DS1|V4\2g c6P0£¨2£©       ½«pmd-2.0.jarÖеÄrulesets½âѹµ½Ö¸¶¨Ä¿Â¼£¬ÕâÀïÃ涨ÒåÁË·ÖÎöËùÐèÒªµÄ¹æÔò¼¯ºÏ¡£51TestingÈí¼þ²âÊÔÍøl7zOf Uv

3QD4U7u9D!pr|0£¨3£©       ÐÞ¸Äbuild.xmlÎļþ¡£ÔÚÕâÒ»°æ±¾ÖУ¬ÌṩÁË2¸öant task¡£Ò»¸öÊÇpmdʹÓùæÔò¼¯ºÏ½øÐзÖÎö£»ÁíÒ»¸öÊǼì²é´úÂëÖÐCopy & Paste´úÂë¡£Õâ2¸öÈÎÎñ¶ÔÓ¦µÄant taskʹÓãº

*x`I,H%V X0 51TestingÈí¼þ²âÊÔÍøspHK$Y;e

PMDÈÎÎñ£º51TestingÈí¼þ²âÊÔÍøUSE]5tLY-Mc0Bk

51TestingÈí¼þ²âÊÔÍø h1RGB oDX IA

   

Z@7|:u5uP c"F;U0 51TestingÈí¼þ²âÊÔÍøU{)?;rk ]8UQ&S

   

/M4K}mY:J j0

1ul D.TH0e#i"B#HS n0       

}(jO$H8?py cxx0

"|zp"Mo0                        classpathref="classpath"/>51TestingÈí¼þ²âÊÔÍøvGe4jh,bcu ?

51TestingÈí¼þ²âÊÔÍø0m'Knh.n[

     51TestingÈí¼þ²âÊÔÍø5OF'QY"Xtw

dG3L_O.K X5wY A0        51TestingÈí¼þ²âÊÔÍø7d4Cc \7B @S

51TestingÈí¼þ²âÊÔÍøKPE.e:f#r

        

l4Iy$i0j0 51TestingÈí¼þ²âÊÔÍøm TiZ/G

           

p|'b6bX`l2s M6`0 51TestingÈí¼þ²âÊÔÍøU.o2Ux1}7e P!k+{

         51TestingÈí¼þ²âÊÔÍø!S,xwEK

~A5t!b] N:PW$m$t0           

6e|2z-E&r,\?*r0

aJ6x'xBS0        

.sZ\@1i{7]$s0 51TestingÈí¼þ²âÊÔÍø%r'G%t+e { dlV D!g

            51TestingÈí¼þ²âÊÔÍø:q$t"jv7\$hk!@w?

51TestingÈí¼þ²âÊÔÍø_KGu gL9`

                51TestingÈí¼þ²âÊÔÍøk`I$VM A

M OT5pG$DA0           

!sDj |O _R2B N0

V4Jzk5u"I @I0       

S pkor,l f(g/W#S1a0 51TestingÈí¼þ²âÊÔÍø,oq.yM'v`4P^

   

pb:sC(O?/[!xy0 51TestingÈí¼þ²âÊÔÍøH i'd"}e

CPDÈÎÎñ£º51TestingÈí¼þ²âÊÔÍø` K;\s/t

Tkj3fd.a^E&U051TestingÈí¼þ²âÊÔÍø%jn5g{~ z

2d|dX}!d4u^%DV0     51TestingÈí¼þ²âÊÔÍøh_CNh4O L^

51TestingÈí¼þ²âÊÔÍø }V6s`8`

       

`UB[%y^0

)K\r6e D |9Y0                            classpathref="classpath"/>

KTCm} M#}?P r0

VuMVn.A$F6s0     51TestingÈí¼þ²âÊÔÍøt_3AEG:}CW

)[ M X,F;r)}0        51TestingÈí¼þ²âÊÔÍøV ll1E:el%w

Mj}tl)Z0         51TestingÈí¼þ²âÊÔÍø]{:`2|%f(tD)m5vK

51TestingÈí¼þ²âÊÔÍø ]A3p#|a:{6DP!@

           

5Cxn9DX}h!I3`0

oR]k a5I$Z [L0                51TestingÈí¼þ²âÊÔÍø*[]PEK^Z

51TestingÈí¼þ²âÊÔÍøv |o LC*a J8u#ax

           

[8~2\j:\#_*if5w0

g;j!b3Q1c~V"J0       

'i Z l!WTf0

4I|U'yO0B k6_0    51TestingÈí¼þ²âÊÔÍø j8A8U+MVT

51TestingÈí¼þ²âÊÔÍøT-m\t$I{g

£¨4£©       ÔËÐÐant pmdºÍant cpd¼´¿É¡£51TestingÈí¼þ²âÊÔÍø4y7ddZ3?3S

1vjjX$a9A$M] N0£¨5£©       ²ÎÊý˵Ã÷£º

&B3TS@7a1j0}(J`w0 51TestingÈí¼þ²âÊÔÍø2P.J;~+]-T2U']

-        formatter£¬Ö¸Ã÷Êä³ö¸ñʽºÍÎļþ¡£

hhFQ9E1Gq-f0 51TestingÈí¼þ²âÊÔÍø.hy.B rh1|g

-        rulesetfiles£¬Ö¸Ã÷·ÖÎöËùÐèµÄ¹æÔòÎļþ£¬²»Í¬ÎļþʹÓöººÅ·Ö¸ô¡£

@0n:K+N+mi8J0

ZVVh2\ n!}0-        failonerror£¬pmdÖ´Ðгö´íÊÇ·ñÖÐÖ¹¹¹½¨¹ý³Ì¡£51TestingÈí¼þ²âÊÔÍø#R{~&[FC

51TestingÈí¼þ²âÊÔÍø.OmZo9ivmN

-        failOnRuleViolation£¬Èç¹ûÓë¹æÔò³åÍ»£¬ÊÇ·ñÖÐÖ¹¹¹½¨¹ý³Ì¡£

2j-^E y9rt.kY0 51TestingÈí¼þ²âÊÔÍø w8}ni,{

-        classpath£¬pmdËùÐèµÄclasspath¡£

az"_b f4q+Js)zp0 51TestingÈí¼þ²âÊÔÍø5B9y(z#f6NsR'p6F&BKX

-        printToConsole£¬ÔÚ·¢ÏÖÎÊÌâʱÊÇ·ñ´òÓ¡µ½ant log»ò¿ØÖÆ̨¡£51TestingÈí¼þ²âÊÔÍød+l-K-D:e^

51TestingÈí¼þ²âÊÔÍøZ Cpw6Cs2p

-        shortFilenames£¬ÔÚÊä³ö±¨¸æÖÐÊÇ·ñʹÓöÌÎļþÃû¡£

)gp?;F&d2x]0 51TestingÈí¼þ²âÊÔÍøJ#l[F%^C

-        targetjdk13£¬ÊÇ·ñ°ÑÄ¿±ê¶¨Îªjdk13£¬Èç²»ÄÜʹÓÃassert¡£

U*sq }Nz)o0 51TestingÈí¼þ²âÊÔÍø']%]&\.}6|?U+w

-        failuresPropertyName£¬ÔÚÈÎÎñ½áÊøʱ£¬²åÈëÎ¥·´¹æÔòµÄºÅÂë51TestingÈí¼þ²âÊÔÍø2P-b\7wUrr

0g,x&hNL,R9z'j0-        encoding£¬¶ÁÔ´ÎļþʱËù²ÉÓõıàÂ룬Èçutf-8¡£51TestingÈí¼þ²âÊÔÍø'C O w@K4q os

51TestingÈí¼þ²âÊÔÍø YG(Y%l4u/I

 

'A a(}(j4IwpV0

5.1.2 TextµÄʹÓÃ

51TestingÈí¼þ²âÊÔÍø.H*}e Orrr[%N1n

°ÑbinĿ¼ÏµÄpmd.batÐÞ¸ÄΪ£º

8v'Xu,h9u(b)m0 51TestingÈí¼þ²âÊÔÍø0^:`;Dd'ffv[.Y,F

java -jar ..\lib\pmd-3.3.jar D:\temp\hpMTS_2.jar[HUANGXB1]  text[HUANGXB2]  rulesets/basic.xml[HUANGXB3] ,rulesets/braces.xml,rulesets/clone.xml,rulesets/codesize.xml,rulesets/controversial.xml,rulesets/coupling.xml, rulesets/design.xml,rulesets/favorites.xml,rulesets/finalizers.xml,rulesets/unusedcode.xml,rulesets/sunsecure.xml,rulesets/strings.xml,rulesets/strictexception.xml,rulesets/scratchpad.xml,rulesets/optimizations.xml,rulesets/naming.xml,rulesets/my-rules.xml,rulesets/logging-java.xml,rulesets/logging-jakarta-commons.xml,rulesets/junit.xml,rulesets/javabeans.xml,rulesets/imports.xml

;lq-UL:g"|F0

o&gh6v7`A]sZ_0 

7xg(M,K5Y8}m s0

5.1      CheckStyle¹¤¾ß

51TestingÈí¼þ²âÊÔÍø)n0l#}6_Sj J"k }` ky

CheckStyleÄ¿Ç°×îа汾ÊÇ: checkstyle-4.0-beta6£¨ÏÂÔØÍøÒ³£©¡£51TestingÈí¼þ²âÊÔÍøvC7Ez!UoD:o H? U

51TestingÈí¼þ²âÊÔÍø h4q\"G3T0sOd8^F

CheckStyleµÄÔËÐл·¾³ÊÇj2se1.3»òÒÔºó°æ±¾£¬°²×°¹ý³ÌͬÑùÒ²Êǽâѹ¼´¿É¡£51TestingÈí¼þ²âÊÔÍø/Y\w5zRm!C4stA

2TJb~}I Z0 

/d}9a VG L6oR t0

5.2.1    ant taskµÄʹÓÃ

f#x A2J d lA0£¨1£©       ¸´ÖÆcheckstyle-4.0-beta6.jarµ½ÏîÄ¿µÄclasspathÖС£

C/o|| y)M DS*P0 51TestingÈí¼þ²âÊÔÍø2IXo!Bwgq A(P D

£¨2£©       ÐÞ¸Äbuild.xmlÎļþ£º51TestingÈí¼þ²âÊÔÍø KU r0v4h

51TestingÈí¼þ²âÊÔÍøI9dW n] r:q(oo\'y u

:}j[%W'N%V0 51TestingÈí¼þ²âÊÔÍø"~:m#hB;y0AA,W)~~

       classpath="${weblib.dir}/checkstyle-all-3.3.jar"/>51TestingÈí¼þ²âÊÔÍøA#D.M D"E)I R;T

'Zo Ll.ka&G8D"D |051TestingÈí¼þ²âÊÔÍød!EMbuQc4z:y

51TestingÈí¼þ²âÊÔÍøj5\iI2v-W]d6LML

       

d W T7]+chWx m"W U0b0

.}%H r]/~ ?.zE @Ny0        51TestingÈí¼þ²âÊÔÍøS&pYFM N0Il

)N6q-R~ m*oj"H0           

n4F%k2t0W-q5H0 51TestingÈí¼þ²âÊÔÍøs\ h+mJJu

            51TestingÈí¼þ²âÊÔÍø jQ)J ft3hea*[

51TestingÈí¼þ²âÊÔÍø3oB7R]oQN g

           

(@x8]9W)y0

zk#S\)VB{i9V D0            51TestingÈí¼þ²âÊÔÍø+sN)H,BB.zGZ| g

51TestingÈí¼þ²âÊÔÍønh,j9]-G}

        51TestingÈí¼þ²âÊÔÍø7?i.Oj4zI'vl

/n8t7F C{"n3Me0        51TestingÈí¼þ²âÊÔÍø'Q\&by:H6H5Si?e|

x7r#VO~d0