当前位置: 首页 > 知识库问答 >
问题:

findbugs报告了关于我的项目代码的这些错误。为什么?

糜征
2023-03-14

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

通过返回对可变对象代码的引用,可以公开内部表示:

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

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

通过合并对可变对象的引用,set更正答案可能会暴露内部表示

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

它说我应该使用整数。parseInt()而不是整数。valueOf()。为什么?

共有2个答案

晋言
2023-03-14

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

要修复它,可以使SubscriptionDaoserializable,或者使ChannelBean不实现serializable。

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

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

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

set更正答案()的情况类似:

字符串[]答案=新字符串[]{“Foo”};对象设置正确答案(答案);答案[0]=“条形”;

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

要解决这个问题,通常最好存储阵列的副本/克隆,这样就不能再从外部对其进行修改。

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

陈法
2023-03-14

您可以显式声明要实现可序列化的包含类。

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

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

对于这两种方法之间的差异,只需做一些研究,比如阅读java中parseInt和valueOf之间的差异?

这就是一切。

 类似资料:
  • 我想在三月计划一个月时间表,而不是使用静态成员。你不需要解释那些评论。“日”和“月时间表”都是类。 在我执行这段代码之前,它有两个错误。一个是“三月[]日”这句话这是一个错误。另一个是'for(int i=0;i 我不明白这些句子错在哪里。语法错误是什么?

  • 我试图使java编译类文件,但它抛出了一个错误,如何修复它。

  • 错误:将字节码转换为dex时出错:原因:com . Android . dex . dex异常:多个dex文件定义了Lcom/Google/Android/GMS/internal/measurement/zza bn;:app:transformClassesWithDexForDebug失败错误:任务执行失败”:app:transformClassesWithDexForDebug。com .

  • 我正在尝试使用JUnit错误收集器报告错误。虽然我的断言失败了,但JUnit中并没有报告错误。但我在控制台中收到了“错误”信息。

  • 给定一个0和1的数组,我们最多可以将K个值从0更改为1。 返回仅包含1的最长(连续)子数组的长度。 例1: 例2: 注: https://leetcode.com/problems/max-consecutive-ones-iii/ 这是问题链接。在第一个测试用例中,我得到了输出9,但应该是6。我不知道哪里出了问题?

  • 错误:无法解决':app@debug /compileClasspath'的依赖关系:无法解决com.android.support: appcompat-v7:29.显示受影响模块的详细信息:应用 错误:无法解决':app@debugAndroidTest /compileClasspath'的依赖关系:无法解决com.android.support: appcompat-v7:29.显示受影响