7

通常の代わりに、クラスと doif (myString == null || myString.equals(""))を使用することを好む傾向があります。org.apache.commons.lang.StringUtilsif (StringUtils.isEmpty(myString))

ただし、これには、少なくとも私が行っている方法では、大きな欠点があります。FindBugs またはコンパイラの警告メカニズム f. 元。Eclipse から - 明示的な null チェックが表示されなくなり、myStringnull の可能性があると見なされなくなるため、潜在的な (または確実な) null ポインターに関する警告が表示されなくなり、これらの警告は私の見解では非常に役立ちます。 .

例 (追加):

import org.apache.commons.lang.StringUtils;

public class TestWarning
{
    void testWarning(String myString)
    {
        //if (myString == null || myString.equals("")) // With this, the last line shows the warning.
        if (StringUtils.isEmpty(myString)) // With this, no warning.
        {
            // Anything.
        }
        int x = myString.length(); // Warning is here: "Potential null pointer access: The variable myString may be null at this location"
    }
}

したがって、この欠点を排除または最小限に抑える方法がないことを確認してStringUtils.isEmpty、ヌルポインターの警告を使用して引き続き取得できるようにしています。たぶん@Nullcheck、メソッドに追加したい注釈などがisEmptyありますか?

追加: たとえば、 のようなカスタム注釈を作成し、それをlike@Nullcheckの引数に追加して、メソッドがその引数で null チェックを行うことを示し、コンパイラの警告メカニズムまたは FindBugs が処理するようにすることは可能でしょうか?明示的なヌルチェックのように?isEmptypublic static boolean isEmpty(@Nullcheck String str)if (StringUtils.isEmpty(myString))

4

3 に答える 3

1

@Nullable で myString に注釈を付ける場合、つまり

void testWarning(@Nullable String myString)

そうすれば、少なくともEclipseは、逆参照すると警告を報告します。

FindBugs もそれについて警告する必要があることに同意しますが、そうさせることもできません。

于 2014-06-16T21:35:03.130 に答える
1

潜在的な null ポインターの警告が表示されるかどうかは、静的コード アナライザーの性能に大きく依存します。論理的には、使用する場合

if (myString == null || myString.equals(""))

あなたのコードは myString が null であることを期待しています。ただし、次の行では myString を逆参照しています。静的コード アナライザーは、これら 2 つの事実を確認し、null ポインターの警告を作成します。

使用する場合

if (StringUtils.isEmpty(myString))

あなたのコードは、myString が null であることを期待しているかどうかを示していません。したがって、静的コード アナライザーは null ポインターの警告を生成しません。静的コード アナライザーは確かに null ポインターの警告を生成することを選択できますが、メソッドへの入力が null である可能性があると想定する必要があるため、多くの誤検出が発生します。

于 2014-06-09T13:07:25.943 に答える