問題は、String.valueOf
メソッドがオーバーロードされていることです。
Java仕様言語では、次のような場合に、最も具体的なオーバーロードを選択することが義務付けられています。
複数のメンバーメソッドがアクセス可能であり、メソッド呼び出しに適用できる場合は、実行時メソッドディスパッチの記述子を提供するために1つを選択する必要があります。Javaプログラミング言語は、最も具体的なメソッドが選択されるという規則を使用します。
Aはchar[]
-で Object
、すべてではないObject
です- char[]
。したがって、char[]
あるより具体的な以下Object
、およびJava言語で指定され、String.valueOf(char[])
過負荷、この場合に選択されます。
String.valueOf(char[])
アレイは、非ことを期待null
し、以降null
この場合には与えられ、それはその後、スローNullPointerException
。
簡単な「修正」は、次のようにnull
明示的にキャストすることObject
です。
System.out.println(String.valueOf((Object) null));
// prints "null"
関連する質問
この話の教訓
重要なものがいくつかあります。
- Effective Java 2nd Edition、Item 41:Use overloading思慮深く
- オーバーロードできるからといって、毎回する必要があるわけではありません
- それらは混乱を引き起こす可能性があります(特にメソッドが大きく異なることをする場合)
- 適切なIDEを使用して、コンパイル時にどのオーバーロードが選択されているかを確認できます
- Eclipseを使用すると、上記の式の上にマウスを置くと、実際に
valueOf(char[])
オーバーロードが選択されていることがわかります。
- 明示的にキャストしたい場合があります
null
(以下の例)
こちらもご覧ください
キャスト時 null
null
特定の参照型に明示的にキャストする必要がある状況が少なくとも2つあります。
- オーバーロードを選択するには(上記の例で指定)
- 与えるには
null
可変引数パラメータに1つの引数として
後者の簡単な例は次のとおりです。
static void vararg(Object... os) {
System.out.println(os.length);
}
次に、次のようにします。
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
こちらもご覧ください
関連する質問
null
この場合など)で1つの引数を呼び出すことができる場合は、その値に関して両方のオーバーロードが同じように動作することを確認してください!