findbugs报告有关我的项目代码的这些bug。为什么?

时间:2018-12-23 10:25:29

标签: java static-analysis findbugs

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

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应该可序列化?我以前从未遇到过这样的建议。

AND

getCorrectAnswerTwo()可以通过返回对可变对象的引用来公开内部表示形式 代码:

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

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

AND

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

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

AND

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

2 个答案:

答案 0 :(得分:2)

您显式声明了包含类以实现Serializeable。

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

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

对于这两种方法之间的区别,只需进行一些研究,例如阅读Difference between parseInt and valueOf in java?

这就是全部。

答案 1 :(得分:2)

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

要解决此问题,请使SubscriptionDao可序列化,或使ChannelBean不实现可序列化。


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

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

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

setCorrectAnswer()相似的情况是

String []答案=新的String [] {“ Foo”};    object.setCorrectAnswers(answers);    answers [0] =“酒吧”;

现在,“ Bar”将是正确的答案。

要解决的是,通常最好存储阵列的副本/克隆,因此无法再从外部进行修改。


Integer.valueOf()创建一个新对象,而Integer.parseInt()没有创建。因此,第二种方法效率最低,因为它没有内存分配的开销。 (尽管一个好的JVM可能会对其进行优化,所以差异可能无法测量,但是仍然更倾向于使用parseInt)。