簡體   English   中英

findbugs報告了我的項目代碼的這些錯誤。為什么?

[英]findbugs reports these bugs about my project code. Why?

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() 這是為什么?

您顯式聲明包含類以實現Serializeable。

因此,有序列化失敗的字段可能是個問題。

並且該方法返回原始數組,因此該方法的任何調用者都可以更改該內部實現細節的狀態。

對於這兩種方法的區別,只需做一些研究,比如閱讀java中parseInt和valueOf之間的區別?

這就是全部。

您的ChannelBean類實現了Serializable 為了使類(或更好:該類的對象)可序列化,其所有字段也必須是可序列化的。 FindBugs警告您,類ChannelBean一個字段不可序列化,在本例中是您的EJB SubscriptionDao 如果您嘗試序列化ChannelBean,它很可能會導致運行時異常,因為它無法序列化,因為EJB不可序列化。

要修復它,要么使SubscriptionDao序列化,要么使ChannelBean不實現Serializable。


公開內部表示:直接返回數組。 該陣列的任何接收器都可以覆蓋其中的值,例如:

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

現在,“我的答案”將是一個正確的答案,它將在將來調用getCorrectAnswer()

setCorrectAnswer()情況類似:

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

現在,“Bar”將是正確答案。

要修復它,通常最好存儲一個數組的副本/克隆,因此不能再從外部修改它。


Integer.valueOf()創建一個新對象,而Integer.parseInt()則不創建。 所以第二個是最低效的,因為它沒有內存分配的開銷。 (雖然一個好的JVM可能會對它進行優化,因此差異可能無法衡量,但仍然可以很好地使用parseInt )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM