【问题标题】:Suppress Android Unread Field warning with byte[]使用 byte[] 抑制 Android 未读字段警告
【发布时间】:2015-12-30 11:03:52
【问题描述】:

我在 Android Studio 中使用 java.lang.SuppressWarnings 包。

我无法摆脱这个:

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

这是通过 setter 方法发生的。

如何摆脱这个警告?

 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[] 的字段上。同一类中具有 getter 的其他字段不会引发此警告。

【问题讨论】:

  • 您是想抑制警告,还是解决代码中的问题?如果是后者,我们需要查看您的代码。
  • 我想找到一种方法来使用@Supress 停止警告...或者找到另一种方法来改进代码(如果有的话)?
  • 感谢@Thomas,实际上它有一个 getter:public byte[] getmPicture() { return mPicture.clone(); } 感谢您指出 setter 的 bean 约定。 (public void setP(T)) 我将尝试使用 Arrays.copyOf()。你建议的最后一件事是“抑制警告”,这正是我需要帮助的。该警告的关键字是什么? @SupressWarning("...?)。谢谢!
  • 您确定 URF_UNREAD_FIELD 适用于mPicture 字段吗?只是问一下,因为您的描述和错误消息中的错误类型不同。
  • 是的,正如我在下面的回答中所写,数组总是可变的。所以是的,这是因为你有一个数组(其他数组也一样)。

标签: java android arrays findbugs


【解决方案1】:

澄清了cmets中的一些东西后,我想答案是这样的。

  1. URF_UNREAD_FIELD - 如果存在 getter,则该字段计为已读取,因为 FindBugs 假定该字段是从类外部读取的。如果没有发生这种情况,则说明存在某种误报,需要进一步分析或抑制。
  2. EI_EXPOSE_REP2 - 数组总是可变的,因此通过从 getter 返回数组,您可以将其公开以进行修改。您可以通过 Arrays.copyOf() 返回数组的副本,或者再次取消警告。

通过 @SuppressFBWarnings 注释 (doc) 抑制 FindBugs 警告。您需要分析过程的类路径上的 FindBugs lib 文件夹中的 annotations.jar 和 jsr305.jar 才能使 FindBugs 注释起作用。示例:

@SuppressFBWarnings("URF_UNREAD_FIELD")

【讨论】:

  • 谢谢,但我必须添加一个外部库才能使用此解决方案。而且 - 不要问为什么;) - 这不是一个选择。
  • 好吧,你问如何抑制 FindBugs 警告,这就是方法。如果您无法更改类路径,并且这些 JAR 不在其上,则您无法抑制 FindBugs 警告。
  • 当然...但是我也可以通过纠正错误来源来抑制警告。当我发布这个错误时,我不知道我必须添加另一个库来抑制警告......所以你的回答肯定对我有帮助!
【解决方案2】:

就像@Thomas 建议的那样,数组总是可变的。 修复是返回属性的副本而不是属性本身:

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; }

我不知道的是,对于像 String 这样的其他类型,简单的 getter 总是会返回对象的副本。数组不是这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多