JavaのString.valueOf()メソッドを説明する

Java

Java 

概念

String.valueOf()メソッドは、引数としてnullが参照されている場合には文字列”null”を返します。

そのため、StringUtils.isBlank()などのメソッドを使用して判断する場合、この場合はtrueが返されます。

これは、valueOf(Object obj)メソッドが呼び出されるためです。

( jdk1.8.0_131の一部のソースコード)

/**
     * Returns the string representation of the {@code Object} argument.
     *
     * @param   obj   an {@code Object}.
     * @return  if the argument is {@code null}, then a string equal to
     *          {@code "null"}; otherwise, the value of
     *          {@code obj.toString()} is returned.
     * @see     java.lang.Object#toString()
     */
    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

String.valueOf()メソッドをnullで呼び出した場合、NullPointerExceptionが発生します。

IDEを使用すると、valueOf(null)が呼び出すStringクラスのメソッドは次のようになります(jdk1.8.0_131の一部のソースコード):

/**
     * Returns the string representation of the {@code char} array
     * argument. The contents of the character array are copied; subsequent
     * modification of the character array does not affect the returned
     * string.
     *
     * @param   data     the character array.
     * @return  a {@code String} that contains the characters of the
     *          character array.
     */
    public static String valueOf(char data[]) {
        return new String(data);
    }

そして、上記のソースコードの中のnew String(data)は以下のメソッドを呼び出します(jdk1.8.0_131でのStringの一部のソースコード)。

/**
     * Allocates a new {@code String} so that it represents the sequence of
     * characters currently contained in the character array argument. The
     * contents of the character array are copied; subsequent modification of
     * the character array does not affect the newly created string.
     *
     * @param  value
     *         The initial value of the string
     */
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length); //value[]为null时,报NPE
    }

valueOf()が“null”文字列を返す可能性があるため、使用する際には特に注意する必要があります。

単純にStringUtils.isEmpty()やisBlank()を使用して、valueOf()の返り値が空かどうかを判断することはできません。

コメント

タイトルとURLをコピーしました