StringのvalueOf方法はnullに伝わります。

1763 ワード

もっと読む
この問題は面白いです。

Object obj = null;  
System.out.println(String.valueOf(obj));  
System.out.println(String.valueOf(null));
最初の文はnullをプリントできますが、第二の文は空のポインターが異常です。
この違いの原因は、両者が異なる積載方法を選択したことにある。
Javaの再負荷過程は二つの段階に分けられます。
第一段階は,入手可能で応用可能なすべての方法またはコンストラクタを選択する。String.valueOfのソースコードを見てください。いくつかの重載方法があります。選択できます。

    String valueOf(Object obj)  //①  
    String valueOf(char data[])  //②
    String valueOf(boolean b)  
    String valueOf(char c)   
    ...  
基本タイプはnullには与えられないので、選択できる方法はvalueOfとvalueOfだけです。
第二段階は、第一段階で選択された方法またはコンストラクタの中で最も正確なものを選択し、もし一つの方法またはコンストラクタが他の方法またはコンストラクタに伝達される任意のパラメータを受け入れることができるならば、第一の方法は第二の方法より正確性に欠けていると言う。方法valueOf(Object obj)は、valueOf(char data)に送信された任意のパラメータを受信することができ、方法valueOf(Object obj)の相対的な方法valueOf(char data[])は正確性に欠けているので、再負荷時に方法valueOf(char data[]を選択します。
方法について①

public static String valueOf(Object obj) {
	return (obj == null) ? "null" : obj.toString();
    }
直接「null」に戻ります。
方法②

public static String valueOf(char data[]) {
	return new String(data);
    }
対応するStering構造方法を見てください。

public String(char value[]) {
	this.offset = 0;
	this.count = value.length;  //※
	this.value = StringValue.from(value);
    }
※に実行すると、空のポインターが異常になります。
コールコードを以下に修正すると、

    value = String.valueOf((Object)null);  
リロード時にvalueOf(Object obj)方法を選択すると、この異常を回避できます。
一方、Objは引用ですが、nullを賦与した後は何も引用しません。
しかし結局nullと違って、nullは特殊な変数です。何も0ではなく、空の対象でもないです。何もないです。