出来ますか?
Object obj=null;
obj.someMethod();
someMethod{/*some code here*/}
nullポインタで静的メソッドを呼び出すことができます。静的メソッド呼び出しでは、ポインターは当然完全に無視されますが、(クラス定義を見ずに)NullPointerExceptionが発生するはずの何かが正常に実行される場合もあります。
class FooObject {
public static void saySomething() {
System.out.println("Hi there!");
}
}
class Main {
public static void main(String[] args) {
FooObject foo = null;
foo.saySomething();
}
}
しかし、明確にするために-いいえ、nullポインタを使用してインスタンスメソッドを呼び出すことはできません。これからプログラマーを保護することは、Javaなどの言語をC++などの「低レベル言語」と区別するための非常に基本的な保護の1つです。これにより、メソッド自体の内部で説明できないsegfault / whatnotを引き起こす代わりに、呼び出し側でエラーを報告できます。
いいえ、できません。メソッドが静的でない限り、NullPointerException がスローされます。メソッドが静的な場合は実行されます。
これを読んでください: null : Java Glossary
いいえ。Java では、null はオブジェクトではありません。
「obj」変数は、ヒープ上のインスタンスを参照していません。そのため、実行時に nullpointerexception が発生します。Java IDE (Eclipse、IDEA) でさえ問題をキャッチし、これについて警告します。
Objectにはがないため、これはコンパイルされませんsomeMethod()
。しかし、あなたが次のようなことについて話しているなら
MyClass o = null;
o.someMethod();
答えは、someMethodが静的であるかどうかによって異なります。静的な場合、値は無視され、nullであるかどうかは関係ありません。
例えば
Thread t = null;
t.yield();
例外なく正常に動作します。
nullオブジェクトは存在しません。あなたの例では、インスタンスへの参照を格納することも、何も格納しないこともできる変数(ポインター)があります。
インスタンスを指していない場合は、メソッドの呼び出しやフィールドへのアクセスに使用できません。
待って、待って-これはコンパイルして実行します:
Math m = null;
System.out.println(m.max(1,2));
静的メソッドを呼び出して、任意の変数の静的フィールドにアクセスできます(コンパイラ/ IDEの警告を無視する必要があります!)しかし、それは別のことです。静的メソッド/変数は、インスタンスではなくクラス自体で呼び出されたりアクセスされたりします。
いいえ、null
参照でメソッドを呼び出す方法はありません(メソッドが静的でない限り)。(null
「ベース」オブジェクトを表すのではなく、オブジェクトをまったく指さない参照を表します。)
ただし、これは正常に機能します(ideone.comリンク):
class MethodTest {
static void someMethod() {
System.out.println("Hello World");
}
}
class Test {
public static void main(String[] args) {
MethodTest mt = null;
mt.someMethod();
}
}
15.12.4.4呼び出すメソッド
の検索メソッドルックアップの戦略は、呼び出しモードによって異なります。[...]
呼び出しモードがの場合、
static
ターゲット参照は不要であり、オーバーライドは許可されません。m
クラスのメソッドはT
呼び出されるものです。それ以外の場合は、インスタンスメソッドが呼び出され、ターゲット参照があります。ターゲット参照が、の場合、 この時点で
null
aがスローされます。NullPointerException
それ以外の場合、ターゲット参照はターゲットオブジェクトを参照していると言われthis
、呼び出されたメソッドのキーワードの値として使用されます。[...]
あなたは実行できません
null.someMethod(); !!!
NullPointerExcpetion
someMethod が static と宣言されていない限り、これは常に a をスローします。ただし、インスタンスで静的メソッドを呼び出すことは非常に悪い習慣です。