FindBugs´íÎó·ÖÎö˵Ã÷ - ͼÎÄ ÏÂÔØ±¾ÎÄ

Bug: Computation of average could overflow

Pattern id: IM_AVERAGE_COMPUTATION_COULD_OVERFLOW, type: IM, category: STYLE ½âÊÍ£º

²ÎÕÕÁËFindbugsµÄ½âÊÍ£¬(low+high)/2µ±Æ½¾ùÊý¹ý´óµÄʱºò£¨ÄѵÀÊdz¬¹ýÁËint×î´óÖµ£¿£© »áÒç³ö£¬»á³öÏÖÒ»¸ö¸ºÖµ£¬´ËÎÊÌâ³öÏÖÔÚÔçÆÚʵÏֵĶþ½øÖÆËÑË÷ºÍ¹é²¢ÅÅÐò£¬µ«ÊÇÒѾ­±»ÐÞ

¸´ÁË¡£²Î¼ûJoshua Bloch£¨googleÊ×ϯjava¼Ü¹¹Ê¦£©widely publicized the bug pattern£¨Ðè·­ ǽ£©.

½â¾ö·½·¨£º

½¨ÒéʹÓÃÎÞ·ûºÅÓÒÒÆÎ»ÔËËã·û£ºuse (low+high) >>> 1

22. SC_START_IN_CTOR

Bug: new AsyncCentral() invokes AsyncCentral$FireThread.start() Pattern id: SC_START_IN_CTOR, type: SC, category: MT_CORRECTNESS ½âÊÍ£º

¹¹Ôì·½·¨ÀïÖØÆôеÄỊ̈߳¬ÎÒ»¹ÊǵÚÒ»´Î¼û¹ýÕâÑùдµÄ¡£ Ê×ÏÈ˵Ã÷Èýµã£º

1. ¶ÔÏóµÄ´´½¨Ò»°ã·ÖÁ½²½×ߣ¬ÔÚ¶ÑÉÏnew¶ÔÏó²Ù×÷£¬Ö´Ðз½·¨£¨°üº¬¹¹Ôì·½·¨£©£¬Îª

ʲôÎÒÃÇ¿ª·¢ÈËÔ±¿´¼ûµÄÖ»ÓÐÒ»²½£¬ÄÇÊÇÒòΪJVM²»ÏëÈÿª·¢ÈËÔ±ÔÚÕâ¸ö¹ý³ÌÖвåÉÏÒ» ½Å£¬ÆÆ»µ¶ÔÏóµÄ³õʼ»¯Á÷³Ì¡£

2. ÀàµÄ¼ÓÔØºÍ³õʼ»¯ÊÇÓÉÐéÄâ»ú±£Ö¤Í¬²½µÄ£¬µ«ÊǶÔÏóµÄÉú³ÉºÍ³õʼ»¯¾ÍûÓÐÈκÎͬ²½»ú

ÖÆÀ´±£Ö¤ÁË¡£

3. ¹¹ÔìÆ÷²»ÄܼÓsynchronized£¬ÊÇÒ»Ïî³ÌÐòÓïÑÔÉè¼ÆÉϵÄÑ¡Ôñ(¼û:JLS 8.8.3 Constructor

Modifiers)£¬Õý³£Çé¿öÏ£¬ÊDz»ÐèÒª¼ÓÉÏsynchronized£¬µ«²»´ú±íËùÓеÄÇé¿ö¶¼²»Òª¼ÓÉÏ synchronized£¬¸ü²»ÄÜÈÏΪһ¸ö¹¹ÔìÆ÷Òþº¬µÄ¾ÍÊÇÒ»¸ösynchronized¡£

ÄÇʲôʱºò¹¹Ôì·½·¨ÐèҪͬ²½ÄØ£¿Í¨³£À´Ëµ£¬·½·¨ÔÚÉú³É¶ÔÏóµÄʱºòÖ»±»Ö´ÐÐÒ»´Î£¬ Ò»°ãnew¶ÔÏóµÄ²Ù×÷¿ÉÄÜÒòΪJVM×ÔÉíµÄ¹ØÏµ±£Ö¤Ô­×ÓÐÔ²Ù×÷£¨×Ô¼ºÒܲâµÄ£¬Ã»ÓÐÈκθù

¾Ý£©£¬ËùÒÔÎÒÃǾ­³£²»ÓùØÐĹ¹Ôì·½·¨Í¬²½µÄÎÊÌâ¡£µ«ÊÇÉÏÊöÇé¿ö¾Í²»Ò»ÑùÁË£¬ÔÚ¹¹Ôì·½·¨ ÖÐÐÂÆôỊ̈߳¬Èç¹ûAsyncCentralÊÇÒ»¸ö״̬À࣬FireThreadÏ̼߳«ÓпÉÄܶÔAsyncCentralµÄ ״̬½øÐз´¸´¶ÁÈ¡ºÍдÈ룬¸üÑÏÖØµÄÒ»ÖÖÇé¿öÊÇ£¬AsyncCentralÓи¸À࣬¼«ÓпÉÄÜÔÚ¸¸ÀàµÄ ¹¹Ôì·½·¨»¹Ã»¿ªÊ¼Ç°£¬FireThreadÏ߳̾ÍÒѾ­¿ªÊ¼Ö´Ðв¢¶ÔAsyncCentralµÄ״̬½øÐС°ÆÆ»µ¡± ÁË¡£Õâ¸öʱºò£¬¾ÍÓÐÁ½¸öÏß³ÌÀ´¶ÔAsyncCentralµÄ״̬½øÐвÙ×÷ÁË£¨Ò»¸öÊÇÖ´Ðз½·¨ µÄỊ̈߳¬Ò»¸öÊÇFireThreadỊ̈߳©£¬×ÔÈ»¶øÈ»£¬¾Í»á´æÔÚͬ²½µÄÎÊÌâÁË¡£

¶àÊýʱºò£¬ÎÒÃÇûÓз¢ÏÖ£¬¿ÉÄÜÊÇAsyncCentralÀàûÓÐ״̬£¬»òÕßÊÇʱºòδµ½£¬ÎÒÏë˵µÄÊÇ£¬ ÎÒÃÇдµÄ´ó²¿·Ö³ÌÐò¶¼´æÔÚͬ²½µÄÎÊÌ⣬±¾Àý×Ó¾ÍÊÇÆäÖÐÒ»¸ö£¬ÖµµÃÎÒÃǺúÃ˼¿¼¡£

ÁíÒ»ÖÖÀí½â£¨¾õµÃ¸ü¿¿Æ×£¬À´×ÔÓÚJava.Concurrency.in.Practice£©½Ð×ö¡°¶ÔÏóÌÓÒÝ¡±£¬Òâ˼¾Í ÊÇ˵ÔÚ¹¹Ôì·½·¨ÀthisÊÇ¿ÉÒÔ·ÃÎʵĵ½µÄ£¬Í¬Ò»Ê±¼ä£¬FireThreadÏ̶߳øÊÇ¿ÉÒÔ·ÃÎʵ½this ¶ÔÏóµÄ£¬ËùÒÔÕâʱºòthis¾Í´Ó·½·¨Ïß³ÌÌÓÒݵ½ÁËFireThreadÏß³ÌÖУ¬Õâʱºò³õʼ»¯¾Í »á´æÔÚ²¢·¢ÎÊÌâ¡£ ½â¾ö·½·¨£º

²»ÒªÔÙ¹¹Ôì·½·¨ÖÐÐÂÆôỊ̈߳¬¿ÉÒÔÌṩinit·½·¨£¬ÆäËû·½·¨¸ù¾Ýʵ¼ÊÇé¿ö¶ø¶¨¡£

23. EQ_SELF_USE_OBJECT

Bug: ManageItem defines equals(ManageItem) method and uses Object.equals(Object) Pattern id: EQ_SELF_USE_OBJECT, type: Eq, category: CORRECTNESS ½âÊÍ£º

ÕâÊÇÖØÔØ£¬²»ÊǸ²¸Ç£¬³ý·ÇÄãÄܱ£Ö¤ÆäËûÈ˵÷ÓÃÕâ¸ö·½·¨´«ÈëµÄ²ÎÊý¶¼ÊÇManageItem µÄ£¬

·ñÔò»áµ÷ÓÃObjectµÄboolean equals(Object)·½·¨£¬ÕâÑùµÄ»°¸ù±¾¾Í²»»áÅܵ½Õâ¸ö·½·¨ÀïÀ´£¡£¡ºÜ¶àËùνµÄ´óÅ£¶¼»á·¸Õâôһ¸ö´íÎó£¬ÎÒ¼áÐÅÕâÊÇÄãÊÖ»¬ÁË¡£ ½â¾ö·½·¨£º

Èç¹ûÄãÏ븲¸Ç¸¸ÀàµÄ·½·¨£¬ÇëÔÚÉÏÃæ¼ÓÉÏ@Override×¢½â£¬Ëü»á·ÀÖ¹ÕâÖÖ´íÎóµÄ³öÏÖ£¨Í¸Â¶ Ò»¸öСϸ½Ú£¬JDK1.5¸²¸Ç½Ó¿Ú·½·¨Ê±¼ÓÉÏ@Override±àÒëÆ÷»á±¨´í£¬JDK1.6ÐÞÕý£¬Õâ¿ÉÄÜÊÇ µ±³õʵÏÖÕß¶Ô@Override×¢½âÀí½âµÄÎÊÌ⣩¡£

24.DLS_DEAD_LOCAL_STORE

°¸Àý¶þ£º

Bug: Dead store to date

Pattern id: DLS_DEAD_LOCAL_STORE, type: DLS, category: STYLE ½âÊÍ£º

ÏÈ¿´¿´£¬ÎÒÃǵijÌÐòÓжàÉÙ¸öÕâÑùµÄÀý×Ó£º

ÕæÊÇÉ˲»Æð°¡£¬²»ÖªµÀµ±Ê±µÄ×÷ÕßÕâÊÇÉñÂíÒâͼ£¿ÊÖ»¬£¿»¹ÊÇÑÛ»¨£¿ËäȻ˵Õâ²»ÊÇÉñÂíÎÊÌ⣬ Ò²²»»á¶Ô³ÌÐòÐÔÄÜÔì³É¶à´óµÄÓ°Ï죬µ«ÊÇÕâ¾ÍÏñÒ»¿Åɳ×Ó£¬ÎÒÃÇÿ¸ö³ÌÐòÔ±¶Ô´ý³ÌÐò¶¼Ó¦¸Ã ÊÇÑÛÀï²»ÄܽøÉ³×ÓµÄ̬¶È£¬µ±È»£¬Äã·ÇÒªÕâôд£¬ÎÒҲûÉñÂí¿É˵µÄ¡£ By the way£º

¶Ô±¾µØ±äÁ¿¶¨ÒåÁËÖ®ºóδʹÓõ½£¬±àÒëÆ÷Äܹ»×öÓÅ»¯´¦Àí£¬Ò²¾ÍÊÇÔÚ±àÒëÖ®ºóµÄclassÎļþ ÖÐɾ³ýÕâЩ±¾µØ±äÁ¿¡£·½·¨ÊÇÔÚeclipseµÄPreferencesÀォÒÔÏµĹ³È¥³ý£º

½â¾ö·½·¨£º

´óµ¨µÄÈ¥µô»òÕß×¢Ê͵ô¡£ Î󱨵ݸÀý£º

ÉÏÊö°¸Àý¶þÖÖ£º

IntegralItemDO integralItem = new IntegralItemDO();

ÊÇÒ»¸ö¾Ö²¿µÄ±äÁ¿£¬²»ÐèÒª¶¨Òåµ½Íⲿȥ£¬¶¨ÒåÔÚÍⲿ£¬¿ÉÄÜ»á±ä³ÉÒ»¸öÎÞЧµÄ±äÁ¿¡£

25.FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER