回答:
null
例外を発生させることなく、任意の参照型にキャストできます。
このprintln
メソッドは、オブジェクトがnullかどうかを最初にチェックするため、nullポインターをスローしません。nullの場合は、単に文字列を出力します"null"
。それ以外の場合toString
は、そのオブジェクトのメソッドを呼び出します。
詳細の追加:内部的に印刷メソッドString.valueOf(object)
が入力オブジェクトのメソッドを呼び出します。そしてvalueOf
メソッドでは、このチェックはnullポインター例外を回避するのに役立ちます:
return (obj == null) ? "null" : obj.toString();
混乱の残りについては、特別な場合ではないにしても、nullオブジェクトのメソッドを呼び出すと、nullポインター例外がスローされます。
null
任意の参照型にキャストできます。をnull
引数として処理するメソッドを呼び出すこともできSystem.out.println(Object)
ますが、null
値を参照してそのメソッドを呼び出すことはできません。
ところで、null
値に対して静的メソッドを呼び出すことができるように見えるトリッキーな状況があります。
Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
t.yield() -> Thread.yeld()
とにかく、バイトコードのコンパイラはそれを「最適化」するためではないでしょうか?どのようfinal int i = 1; while (i == 1)
に最適化されるのかと同様while(true)
これは仕様によるものです。null
任意の参照型にキャストできます。そうしないと、それを参照変数に割り当てることができません。
メソッドがオーバーロードされており、nullがこれらのオーバーロードされたメソッドに渡された場合、コンパイラーはあいまいさを解消する方法がわからないため、これらのケースではnullを型キャストする必要があるため、null値のキャストが必要です。
class A {
public void foo(Long l) {
// do something with l
}
public void foo(String s) {
// do something with s
}
}
new A().foo((String)null);
new A().foo((Long)null);
そうしないと、必要なメソッドを呼び出すことができませんでした。
String bar = null;
、null
値をにキャストしますString
。これまでのところ、メソッドがオーバーロードされているテストでnullを明示的にキャストするだけで、null入力を使用してその動作をテストしたかったのです。それでも、知っておくと良いのは、あなたの答えが見つかる前に、同じような答えを書こうとしていたことです。
l instanceof Long
そして、これらの場合にs instanceof String
戻りfalse
ます。
ここですでに述べた多くの答え
nullを任意の参照型にキャストできます
そして
引数がnullの場合、「null」に等しい文字列
それがどこに指定されているのか疑問に思い、Java仕様を調べました。
他の人が書いたように、すべてにnullをキャストできます。通常、それは必要ありません、あなたは書くことができます:
String nullString = null;
そこにキャストを置くことなく。
しかし、そのようなキャストが意味をなす場合があります。
a)特定のメソッドが確実に呼び出されるようにしたい場合:
void foo(String bar) { ... }
void foo(Object bar) { ... }
入力すると違いが出ます
foo((String) null) vs. foo(null)
b)IDEを使用してコードを生成する場合。たとえば、私は通常、次のような単体テストを作成しています。
@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
new MyClassUnderTest((Whatever) null);
}
私はTDDを行っています。これは、クラス「MyClassUnderTest」がおそらくまだ存在していないことを意味します。そのコードを書き留めておくことで、IDEを使用して最初に新しいクラスを生成できます。そして、「箱から出して」「何でも」引数を受け入れるコンストラクターを生成する-IDEは、コンストラクターがWhatever型の引数を1つだけ取る必要があることをテストから判断できます。
印刷:
オブジェクトを印刷します。String.valueOf(Object)メソッドによって生成された文字列はバイトに変換されます
引数がnullの場合、「null」に等しい文字列。それ以外の場合は、obj.toString()の値が返されます。
オブジェクトがの場合、値「null」の文字列を返すだけですnull
。
これは、あいまいな方法を使用する場合に非常に便利です。たとえば、JDialogには次のシグネチャを持つコンストラクタがあります。
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
GraphicsConfigurationを設定するため、このコンストラクタを使用する必要がありますが、このダイアログの親がないため、最初の引数はnullにする必要があります。使用する
JDialog(null, String, boolean, Graphicsconfiguration)
あいまいなので、この場合は、サポートされている型のいずれかにnullをキャストすることで、呼び出しを絞り込むことができます。
JDialog((Frame) null, String, boolean, GraphicsConfiguration)