8

重複の可能性:
null参照で(静的)メソッドを呼び出してもNullPointerExceptionがスローされないのはなぜですか?
Javaのnull参照の静的フィールド

私はこの古いビデオのコードを試しました:

class Impossible {
    public static void main(String[] args) {
        Thread t = null;
        System.out.println(t.currentThread().getName());
    }
}

出力:main

さて、一体何なの?ルールjava.lang.Threadに違反していませんか?NullPointerException

しかし、私が最も興味を持っているのは、その変数がNullPointerExceptionをスローするように動作させるにはどうすればよいでしょうか。

4

4 に答える 4

10

java.lang.ThreadはNullPointerExceptionルールに違反していますか?

いいえNPE、スローされた理由はに関連していませんclass。これはinstance、呼び出しが行われるそのクラスのに関連しています。また、アクセスしているメソッドまたはフィールドのタイプによっても異なります。

ここで起こっているのは、currentThread()Threadクラスの静的メソッドです。これは、インスタンスではなく、クラスに組み込まれています。したがって、Threadクラスの参照で呼び出したとしても、実際にはクラス名で呼び出されます。

それで、

Thread t = null
t.currentThread();

実際には次のように呼び出されます:-

Thread.currentThread();

したがって、オブジェクト参照式を介して静的メンバーにアクセスする場合、重要なのは宣言されたタイプの参照のみです。この意味は:

  • インスタンスは必要ないため、参照が実際にnullを指しているかどうかは関係ありません。

  • 参照がnullでない場合、参照が指しているオブジェクトのタイプは関係ありません。動的ディスパッチはありません。


その変数をNullPointerExceptionをスローするように動作させるにはどうすればよいですか?

まあ、現在のprintステートメントは決して。をスローしませんNPE。最初の部分はすでに上で説明されています。それでは、先に進みましょう。

Thread.currentThread();

上記の呼び出しは決して戻りませんnull。常に現在のスレッドインスタンスを返します。そしてJavaでは、あなたは常にどちらかのスレッドの中にいます。メソッド内でもpublic static void main、を実行していMain Threadます。だから、currentThreadすることはできませんnull

したがって、さらなる呼び出し:-

Thread.currentThread().getName();

正常に動作し、現在のスレッドの名前を返します。

于 2012-11-24T09:42:10.343 に答える
3

currentThread()staticクラスのメソッドですThread。これは、クラスの特定のインスタンスではなく、クラス自体に関連付けられていることを意味します。

これを念頭に置いて、t.currentThread()は単に別の言い方Thread.currentThread()です。の値tはまったく使用されないため、であるかどうかtは関係ありませんnull

于 2012-11-24T09:43:36.663 に答える
0

静的メソッドを呼び出してNullPointerExceptionをスローすることはできません。したがって、インスタンスメソッドを呼び出す必要があります。たとえば、どのインスタンスメソッドでも呼び出すことができます。

t.checkAccess();
t.getId();
t.getName();

于 2012-11-24T10:02:08.217 に答える
0

開発環境(Eclipse / Netbeans)内にそのコードがcurrentThread()表示されている場合は、筆記体で記述されたコードが最初に表示されます。これは、静的メソッド(Classメソッド)であることを明確に示しています。

さらに、checkstyleを有効にしている場合は、オブジェクトのインスタンスで静的メソッドを呼び出さないように警告します。

ここでのコードフォーマットでは、異なるフォーマットの静的メソッドを表示できないため、質問は少しファウルです。

そして最後に質問に答えるために:クラススレッドは決してnullではなく、クラスのインスタンスはnullになる可能性があります。

于 2012-11-24T16:33:31.173 に答える