2016-10-28 4 views
0

私はsquidを修正するには:S2259 `'getString'はここでnullableであるため、NullPointerExceptionがスローされる可能性がありますか?

/** 
* Checks if the server name is equal to localhost in the servlet request. 
* 
* @param request 
*   servlet request 
* @return true if the server name is equal to localhost. 
*/ 
public boolean isLocalHost(@Nonnull final ServletRequest request) { 

    return settings != null && settings.getString(LOCALHOST) != null && settings.getString(LOCALHOST).equals(request.getServerName()); 
} 

しかしSonarqubeがgetStringが原因ブール短絡に私が言うことができるものから、それを実現することができないにもかかわらず、NULL可能であってもよいことcomplaingを続けている

+1

割り当て戻り値() '変数に?副次的な利点:一度呼び出すだけで、パフォーマンスが向上します。 – Andreas

答えて

3

SonarQubeは、次のコードブロックを認識することはできませんしていますsettings.getStringの連続する呼び出しが同じ値を返すという事実。

他のスレッドが呼び出し間で設定を変更する可能性があるためかもしれません。

コメントに記載されている@Andreasのように変数に値を代入すると、この問題が解決するはずです。

UPD

public boolean isLocalHost(@Nonnull final ServletRequest request) { 
    String requestServerName = request.getServerName(); 

    return settings != null && requestServerName != null && requestServerName.equals(settings.getString(LOCALHOST)); 
} 

UPD2:別の側から

public boolean isLocalHost(@Nonnull final ServletRequest request) { 
    if(settings == null) { 
     return false; 
    } 

    String localhost = settings.getString(LOCALHOST); 

    return localhost != null && localhost.equals(request.getServerName()); 
} 

またはチェック可変断片のいずれかを削除ためのgetString `からHttpServletRequest.getServerName() occasionally returning null in concurrent use?

+0

適切なコードサンプルを追加するだけで、この回答を受け入れます。 –

+1

ただ一つの事を追加するだけです: 'int foo(){return i ++;}'というマルチスレッドがなくても、連続する2つの呼び出しが異なる結果を返すかもしれません。 – benzonico

関連する問題