2015-12-30 12 views
6

Ich verwende das java.lang.SuppressWarnings Paket in Android Studio.Unterdrücken Android Ungelesene Feld Warnung mit Byte []

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

mit einer Set-Methode Es geschieht:

Ich kann nicht von diesem befreien.

Irgendwelche Ideen, wie man diese Warnung loswerden kann? Danke!

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

Warnung:

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

Hinweis dies auf dem einzigen Feldtyp, das geschieht ist byte[]. Andere Felder in der gleichen Klasse, die Getter haben, geben diese Warnung nicht aus.

+0

Versuchen Sie, die Warnung zu unterdrücken oder das Problem im Code zu lösen? Wenn es Letzteres ist, müssten wir Ihren Code sehen. –

+0

Ich möchte entweder einen Weg finden, die Warnung mit einem @Supress zu stoppen ... oder einen anderen Weg finden, den Code zu verbessern, wenn es einen gibt? – estoke

+0

Danke @Thomas, eigentlich hat es einen Getter: 'public byte [] getmPicture() {return mPicture.clone(); } Danke, dass du mir die Bean Convention für Setter gezeigt hast. ('public void setP (T)') Ich werde es mit Arrays.copyOf() versuchen. Und das letzte, was Sie vorschlagen, "die Warnung zu unterdrücken", für die ich Hilfe brauche. Was wäre das Schlüsselwort für diese Warnung? @SupressWarning ("...?). Danke! – estoke

Antwort

0

So wie @Thomas vorgeschlagen, Arrays sind immer veränderbar. Das Update wurde eine Kopie der Eigenschaft anstelle der Eigenschaft selbst Rückkehr:

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

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

statt

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

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

Was ich nicht wusste ist, dass für eine andere Art wie String zum Beispiel eines einfachen Getter würde immer eine Kopie des Objekts zurückgeben. Das ist bei Arrays nicht der Fall.

0

Nach Klärung einiger Sachen in den Kommentaren denke ich, die Antwort ist dies.

  1. URF_UNREAD_FIELD - Das Feld gilt als gelesen, wenn ein Getter existiert, weil FindBugs dann annimmt, dass das Feld von außerhalb der Klasse gelesen wird. Wenn dies nicht geschieht, haben Sie eine Art falsch positives Ergebnis, das eine weitere Analyse oder Unterdrückung erfordern würde.
  2. EI_EXPOSE_REP2 - Arrays sind immer veränderbar. Wenn Sie also das Array vom Getter zurückgeben, setzen Sie es der Modifikation aus. Sie können eine Kopie des Arrays über Arrays.copyOf() zurückgeben oder die Warnung erneut unterdrücken.

FindBugs Warnungen werden über die @SuppressFBWarnings Annotation (doc) unterdrückt. Sie benötigen "annotations.jar" und "jsr305.jar" aus dem Ordner FindBugs lib im Klassenpfad des Analyseprozesses, damit FindBugs-Annotationen funktionieren. Beispiel:

@SuppressFBWarnings("URF_UNREAD_FIELD") 
+0

danke, aber ich müsste eine externe Bibliothek hinzufügen, um diese Lösung verwenden zu können. Und - frag nicht warum;) - es ist keine Option. – estoke

+0

Nun, Sie haben gefragt, wie FindBugs Warnungen unterdrückt werden können, und das ist wie. Wenn Sie den Klassenpfad nicht ändern können und diese JARs nicht vorhanden sind, können Sie FindBugs-Warnungen nicht unterdrücken. –

+0

Sicher ... Aber ich kann die Warnung auch unterdrücken, indem ich die Quelle des Fehlers korrigiere. Als ich diesen Fehler veröffentlichte, wusste ich nicht, dass ich eine weitere Bibliothek hinzufügen musste, um die Warnung zu unterdrücken ... Ihre Antwort hat mir definitiv geholfen! – estoke

Verwandte Themen