2015-12-30 9 views
6

मैं एंड्रॉइड स्टूडियो में java.lang.SuppressWarnings पैकेज का उपयोग कर रहा हूं।बाइट के साथ सुपर्रेस एंड्रॉइड अपठित फील्ड चेतावनी []

मैं इस एक छुटकारा नहीं मिल सकता है:

EI_EXPOSE_REP2: May expose internal representation by incorporating reference to mutable object (findbugs task) 

यह एक सेटर विधि के साथ हो रहा है।

इस चेतावनी से छुटकारा पाने के तरीके पर कोई विचार? धन्यवाद!

public class PropertyDetailDocumentStorageModel implements Parcelable { 
@SerializedName("picture") 
private byte[] mPicture;  
public void setmPicture(byte[] mPicture) { this.mPicture = mPicture; } 

चेतावनी:

setmPicture(byte[]) may expose internal representation by storing an externally mutable object into PropertyDetailDocumentStorageModel.mPicture 

नोट यह केवल क्षेत्र है जिसका प्रकार byte[] है पर हो रहा है। उसी वर्ग में अन्य फ़ील्ड जो गेटर्स हैं, इस चेतावनी को फेंक नहीं रहे हैं।

+0

क्या आप चेतावनी को दबाने की कोशिश कर रहे हैं, या कोड में समस्या का समाधान कर रहे हैं? यदि यह बाद वाला है, तो हमें आपका कोड देखना होगा। –

+0

मैं या तो @Supress के साथ चेतावनी को रोकने का तरीका ढूंढना चाहता हूं ... या यदि कोई है तो कोड को बेहतर बनाने का दूसरा तरीका ढूंढना चाहते हैं? – estoke

+0

धन्यवाद @ थॉमस, वास्तव में इसमें एक गेटर है: 'सार्वजनिक बाइट [] getm चित्र() {वापसी mPicture.clone(); } 'सेटटर के लिए बीन सम्मेलन को इंगित करने के लिए धन्यवाद। ('सार्वजनिक शून्य सेटपी (टी)') मैं इसे Arrays.copyOf() के साथ आज़मा दूंगा। और आखिरी बात जो आप "चेतावनी दबाने" का सुझाव देते हैं, जो वास्तव में मुझे मदद की ज़रूरत है। उस चेतावनी के लिए कीवर्ड क्या होगा? @SupressWarning ("...?)। धन्यवाद! – estoke

उत्तर

0

तो जैसे @ थॉमस ने सुझाव दिया, Arrays हमेशा mutable हैं। ठीक संपत्ति खुद की संपत्ति की एक प्रति लौट रहा था बजाय:

public byte[] getmPicture() { return Arrays.copyOf(mPicture, mPicture.length); } 

public void setmPicture(final byte[] picture) { this.mPicture = Arrays.copyOf(picture, picture.length); } 
बजाय

public byte[] getmPicture() { return mPicture; } 

public void setmPicture(byte[] picture) { this.mPicture = picture; } 

क्या मुझे नहीं पता था कि उदाहरण के लिए स्ट्रिंग की तरह अन्य प्रकार के लिए, एक सरल है गेटटर हमेशा वस्तु की एक प्रति वापस करेगा। यह Arrays के लिए मामला नहीं है।

0

टिप्पणियों में कुछ सामान स्पष्ट करने के बाद, मुझे लगता है कि जवाब यह है।

  1. URF_UNREAD_FIELD - फ़ील्ड गेटटर मौजूद होने पर पढ़ने के रूप में गिना जाता है, क्योंकि तब FindBugs मानता है कि फ़ील्ड कक्षा के बाहर से पढ़ा जाता है। यदि ऐसा नहीं होता है, तो आपके पास कुछ प्रकार का झूठा सकारात्मक होता है जिसके लिए आगे विश्लेषण या दमन की आवश्यकता होती है।
  2. EI_EXPOSE_REP2 - Arrays हमेशा उत्परिवर्तनीय होते हैं, इसलिए गेटर से सरणी लौटकर आप इसे संशोधित करने के लिए उजागर करते हैं। आप Arrays.copyOf() के माध्यम से सरणी की एक प्रति वापस कर सकते हैं, या फिर, चेतावनी दबाएं।

FindBugs चेतावनी @SuppressFBWarnings एनोटेशन (doc) के माध्यम से दबा दिया जाता है। आपको Findbugs एनोटेशन के लिए विश्लेषण प्रक्रिया के क्लासपाथ पर FindBugs lib फ़ोल्डर से annotations.jar और jsr305.jar की आवश्यकता है। उदाहरण:

@SuppressFBWarnings("URF_UNREAD_FIELD") 
+0

धन्यवाद लेकिन, मैं एक बाहरी पुस्तकालय जोड़ने के लिए इस समाधान का उपयोग करने में सक्षम होना होगा। और - क्यों नहीं पूछें;) - यह एक विकल्प नहीं है। – estoke

+0

ठीक है, आपने पूछा कि FindBugs चेतावनियों को दबाने के तरीके, और यह कैसे है। यदि आप क्लासपाथ नहीं बदल सकते हैं, और ये जेएआर इस पर नहीं हैं, तो आप FindBugs चेतावनियों को दबा नहीं सकते हैं। –

+0

ज़रूर ... लेकिन मैं त्रुटि के स्रोत को सही करके चेतावनी को दबा सकता हूं। जब मैंने यह बग प्रकाशित किया, मुझे नहीं पता था कि मुझे चेतावनी को हल करने के लिए एक और पुस्तकालय जोड़ना था ... तो आपके जवाब ने निश्चित रूप से मेरी मदद की! – estoke

संबंधित मुद्दे