String での null の扱い

Object の文字列表現を得る方法

以下のような方法があると思います。

Object obj = new Object();

obj.toString();
(String)obj;
String.valueOf(obj);

ところが、この3つの方法の結果は次のような場合異なる結果となってしまう。

Object obj = null;
obj.toString();

NullPointerException

(String)obj;

NullPointerException

String.valueOf(obj);

⇒ "null" !?

検証。

/**
 *
 */
public class Null {

	public static void main(String[] args) {

		Object obj1 = null;
		Object obj2 = "null";

		String str1 = String.valueOf(obj1);
		String str2 = String.valueOf(obj2);

		System.out.println(str1);
		System.out.println(str2);

		try {

			if (obj1.equals(obj2)) {
				System.out.println("Object では null も \"null\" も一緒じゃん! ");
			} else {
				System.out.println("Object では null と \"null\" はべつもん! ");
			}
		} catch (NullPointerException e) {
			System.out.println("Object では null と \"null\" はべつもん! ");
			e.printStackTrace();
		}
		try {
			if (str1.equals(str2)) {
				System.out.println("String では null も \"null\" も一緒じゃん! ");
			} else {
				System.out.println("String では null と \"null\" はべつもん! ");
			}
		} catch (NullPointerException e) {
			System.out.println("String では null と \"null\" はべつもん! ");
			e.printStackTrace();
		}

	}
}

実行結果

null
null
Object では null と "null" はべつもん! 
String では null も "null" も一緒じゃん! 
java.lang.NullPointerException
	at Null.main([Ljava.lang.String;)V(Null.java:55)

この問題により StringBuffer で発生する問題

ちなみに、StringBuffer.append で利用されているため、nullをappendすると "null"という文字列が追加されてしまう。

/* 1.4
      public synchronized StringBuffer append(String str) {
        if (str == null) {
            str = String.valueOf(str);
        }

        int len = str.length();
        int newcount = count + len;
        if (newcount > value.length)
            expandCapacity(newcount);
        str.getChars(0, len, value, count);
        count = newcount;
        return this;
    }

 */

J2SE5にいたっては"null"べた書き・・・・

/* 1.5 
 	public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";    
        int len = str.length();
        if (len == 0) return this;
        int newCount = count + len;
        if (newCount > value.length)
            expandCapacity(newCount);
        str.getChars(0, len, value, count);
        count = newCount;
        return this;
    }
 */ 

java.util.TreeMap で降順ソート

  • TreeMap はデフォルトコンストラクタでNEWすると昇順。
    SortedMap tree = new TreeMap();
    これは昇順
  • 次のようなComparatorを用意する。
    public class DescComparator implements java.util.Comparator {
    	public int compare(Object obj1, Object obj2) {
    		return ((Comparable) obj1).compareTo(obj2) * -1;
    	}
    }
SortedMap tree = new TreeMap(new DescComparator());

で、このようにNEW。

JISAutoDetect?

new InputStreamReader(new FileInputStream("hoge.txt"),"JISAutoDetect");

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-04-07 (金) 16:01:32 (228d)