мы можем вызвать любой метод для нулевого объекта?

Является ли это возможным?

Object obj=null;

obj.someMethod();

someMethod{/*some code here*/}

person Anand    schedule 02.05.2011    source источник
comment
Ну, вы, конечно, можете... просто метод не может быть выполнен, так как вы получаете NullPointerException.   -  person Péter Török    schedule 02.05.2011


Ответы (10)


Вы можете вызвать статический метод для нулевого указателя. Указатель, естественно, будет полностью проигнорирован при вызове статического метода, но это все же тот случай, когда что-то, что (не глядя на определение класса), по-видимому, должно вызывать исключение 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();
    }
}

Но просто чтобы было понятно — нет, вы не можете вызывать метод экземпляра с нулевым указателем. Защита программиста от этого — одна из основных мер защиты, которая отличает такие языки, как Java, от «языков более низкого уровня», таких как C++. Это позволяет сообщать об ошибке на вызывающем конце, вместо того, чтобы вызывать необъяснимый segfault/что-то еще внутри самого метода.

person Matti Virkkunen    schedule 02.05.2011
comment
Следует отметить, что вызов метода static из такой переменной почти всегда считается плохим стилем: он подразумевает отношение, когда его нет. - person Joachim Sauer; 02.05.2011
comment
Почему почти? Вы знаете хоть один случай, когда это предпочтительнее? - person aioobe; 02.05.2011
comment
@aioobe Вы можете указать, что она принадлежит соседней переменной, без необходимости анализировать, что переменная имеет определенный тип, к которому принадлежит этот статический класс. - person Thorbjørn Ravn Andersen; 23.11.2017

Нет мы не можем. он будет вызывать исключение NullPointerException, если метод не является статическим. Если метод статический, он будет работать.

Прочитайте это: null: Глоссарий Java

person Harry Joy    schedule 02.05.2011
comment
+0: ​​этого не будет, если someMethod() является статическим. - person Peter Lawrey; 02.05.2011
comment
@Nirmal, я предлагаю вам попробовать. Смотрите мой пример. ;) - person Peter Lawrey; 02.05.2011

Нет. В Java null не является объектом.

person Don Roby    schedule 02.05.2011

Переменная «obj» не ссылается ни на один экземпляр в куче. По этой причине вы получите исключение nullpointerException во время выполнения. Даже ваша Java IDE (Eclipse, IDEA) уловит проблему и предупредит вас об этом.

person Erhan Bagdemir    schedule 02.05.2011
comment
Не для статического метода. Это правильно, что IDE часто отмечают это. - person Thorbjørn Ravn Andersen; 23.11.2017

да, вы можете вызвать, если метод является статическим, потому что статический метод связывается во время компиляции, и для статической привязки используется только тип переменной, а не значение объекта.

если вы попробуете то же самое для нестатического метода, будьте готовы поймать исключение нулевого указателя.

person loknath    schedule 29.05.2014

ты не можешь выполнить

null.someMethod(); !!!

person Nirmal- thInk beYond    schedule 02.05.2011
comment
Не так, но ((ClassWithStaticMethod) null).someMethod() отлично работает ;-) - person aioobe; 02.05.2011

Это всегда будет генерировать NullPointerExcpetion, если только некоторый метод не объявлен статическим. Однако вызов статических методов для экземпляра — очень плохая практика.

person wjans    schedule 02.05.2011

Это не скомпилируется, так как Object не имеет someMethod(). Однако, если вы говорите о чем-то вроде

MyClass o = null;
o.someMethod();

ответ зависит от того, является ли someMethod статическим или нет. Если оно статично, значение игнорируется, и не имеет значения, является ли оно нулевым или нет.

e.g.

Thread t = null;
t.yield();

работает нормально без исключения.

person Peter Lawrey    schedule 02.05.2011

Нулевой объект не существует. В вашем примере у вас есть переменная (указатель), которая может либо хранить ссылку на экземпляр, либо ничего.

Если он не указывает на экземпляр — ну, тогда мы не можем использовать его для вызова методов или доступа к полям.


подождите, подождите — это компилируется и запускается:

Math m = null;
System.out.println(m.max(1,2)); 

Мы можем вызывать статические методы и получать доступ к статическим полям в любой переменной (нам просто нужно игнорировать предупреждения компилятора/IDE!) Но это нечто другое, статический метод/переменная не вызывается/не обращается к экземпляру а на самом классе.

person Andreas Dolk    schedule 02.05.2011

Нет, невозможно вызвать метод по ссылке 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();
    }
}

Соответствующая цитата из JLS:

15.12.4.4 Поиск метода для вызова
Стратегия поиска метода зависит от режима вызова.

[...]

Если режим вызова static, ссылка на цель не требуется, и переопределение не допускается. Вызывается метод m класса T.

В противном случае должен быть вызван метод экземпляра и имеется целевая ссылка. Если целевой ссылкой является null, в этой точке создается NullPointerException. В противном случае считается, что целевая ссылка ссылается на целевой объект и будет использоваться в качестве значения ключевого слова this в вызываемом методе. .

[...]

person aioobe    schedule 02.05.2011