問題は、String.valueOf
メソッドがオーバーロードされていることです:
Java仕様言語では、このような場合、最も具体的なオーバーロードを選択することが義務付けられています。
複数のメンバーメソッドがアクセス可能であり、メソッド呼び出しに適用できる場合は、実行時メソッドディスパッチの記述子を提供するために1つを選択する必要があります。Javaプログラミング言語は、最も具体的な方法が選択されるという規則を使用します。
Achar[]
は-です Object
が、すべてObject
ではあり char[]
ません-a 。したがって、はよりchar[]
も具体的でObject
あり、Java言語で指定されているようString.valueOf(char[])
に、この場合はオーバーロードが選択されます。
String.valueOf(char[])
配列が非null
であると想定しnull
、この場合はであるため、をスローしNullPointerException
ます。
簡単な「修正」は、次のようにnull
明示的にキャストすることです。Object
System.out.println(String.valueOf((Object) null));
// prints "null"
関連する質問
この話の教訓
重要なものがいくつかあります。
- 効果的なJava2ndEdition、アイテム41:オーバーロードを慎重に使用する
- あなたが過負荷になることができるという理由だけで、あなたが毎回すべきであるという意味ではありません
- それらは混乱を引き起こす可能性があります(特にメソッドが大きく異なることを行う場合)
- 優れたIDEを使用すると、コンパイル時にどのオーバーロードが選択されているかを確認できます
- Eclipseを使用すると、上記の式にマウスを合わせると、実際に
valueOf(char[])
オーバーロードが選択されていることがわかります。
- 明示的にキャストしたい場合があります
null
(以下の例)
も参照してください
キャスティングについてnull
null
特定の参照型に明示的にキャストする必要がある状況は少なくとも2つあります。
- オーバーロードを選択するには(上記の例で示したように)
null
varargパラメータに単一の引数として与える
後者の簡単な例は次のとおりです。
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"
も参照してください
関連する質問