【问题标题】:findbugs reports these bugs about my project code. Why?findbugs 报告有关我的项目代码的这些错误。为什么?
【发布时间】:2019-05-22 23:46:04
【问题描述】:

findbugs 报告有关我的项目代码的这些错误。

class channelBean defines non-transient non-serializable instance field subscriptionDao
in ChannelBean.java
Field com.derbyware.qtube.beans.ChannelBean.subscriptionDao
Actual type com.derbyware.qtube.dao.SubscriptionDao 

代码:

@Named
@ViewScoped
public class ChannelBean extends BaseBacking implements Serializable {
    private static final long serialVersionUID = 1L;

    @EJB
    private SubscriptionDao subscriptionDao;

为什么它说我的 EJB 应该是可序列化的?我以前从未遇到过这样的建议。

getCorrectAnswerTwo() 可能通过返回对可变对象的引用来暴露内部表示 代码:

public String[] getCorrectAnswerTwo() {
        return correctAnswerTwo;
    }

我需要在 jsf 页面中显示数组。那么为什么该工具报告这是一个问题。

setCorrectAnswers 可以通过合并对可变对象的引用来公开内部表示

public void setCorrectAnswers(String[] correctAnswers) {
        this.correctAnswers = correctAnswers;
    }

它说我应该使用Integer.parseInt() 而不是Integer.valueOf()。这是为什么呢?

【问题讨论】:

  • 请考虑每个问题问一个问题。
  • 在 web 环境中,您可以忽略 #setCorrectAnswers 的警告,因为每个用户都有自己的 ChannelBean 实例 (ViewScoped)

标签: java static-analysis findbugs


【解决方案1】:

您的类ChannelBean 实现Serializable。为了使一个类(或更好:该类的一个对象)可序列化,它的所有字段也必须是可序列化的。 FindBugs 警告您,您的类 ChannelBean 的一个字段不可序列化,在这种情况下您的 EJB SubscriptionDao。 如果您尝试序列化 ChannelBean,很可能会导致运行时异常,因为 EJB 不可序列化,因此无法序列化。

要修复它,要么使SubscriptionDao 可序列化,要么使ChannelBean 不实现可序列化。


公开内部表示: 您直接返回数组。该数组的任何接收者都可以覆盖其中的值,例如:

String[] answers = object.getCorrectAnswers();
answers[0] = "My Answer";

现在,“我的答案”将是一个正确答案,并且会在以后调用 getCorrectAnswer() 时返回。

setCorrectAnswer()的情况类似:

String[] 答案 = new String[]{"Foo"}; object.setCorrectAnswers(答案); 答案[0] = "酒吧";

现在,“酒吧”将是正确答案。

要解决的是,通常最好存储一个数组的副本/克隆,这样就不能再从外部对其进行修改了。


Integer.valueOf() 创建一个新对象,而Integer.parseInt() 没有。所以第二个效率最低,因为它没有内存分配的开销。 (虽然一个好的 JVM 可能会将其优化掉,因此差异可能无法衡量,但首选 parseInt 仍然很有用。

【讨论】:

  • “它的所有字段也必须是可序列化的”它们也可以为空。但这并没有多大用处。
【解决方案2】:

您明确声明包含类以实现 Serializeable。

因此,具有会导致序列化失败的字段可能是一个问题。

并且该方法返回原始数组,因此该方法的任何调用者都可以更改该内部实现细节的状态。

对于这两种方法的区别,简单做一些研究,比如阅读Difference between parseInt and valueOf in java?

这就是全部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多