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

#java #null #method-call

#java #null #метод-вызов

Вопрос:

возможно ли это?

 Object obj=null;

obj.someMethod();

someMethod{/*some code here*/}
  

Комментарии:

1. Ну, вы, конечно, можете … просто метод не может быть выполнен, когда вы получаете NullPointerException .

Ответ №1:

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

Комментарии:

1. Следует отметить, что вызов static метода из подобной переменной почти повсеместно считается плохим стилем: он подразумевает связь, когда ее нет.

2. Почему почти ? Вы знаете какой-либо случай, когда это предпочтительнее?

3. @aioobe Возможно, вы захотите указать, что он принадлежит переменной «поблизости», без необходимости анализировать, что переменная имеет определенный тип, к которому принадлежит этот статический класс.

Ответ №2:

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

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

Комментарии:

1. 0: Этого не произойдет, если someMethod() является статическим.

2. @Nirmal, я предлагаю тебе попробовать это. Смотрите мой пример. 😉

Ответ №3:

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

Ответ №4:

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

Комментарии:

1. Не для статического метода. Правильно, что IDE часто помечают это.

Ответ №5:

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

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

Ответ №6:

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

null.someMethod(); !!!

Комментарии:

1. Не так, но ((ClassWithStaticMethod) null).someMethod() работает просто отлично 😉

Ответ №7:

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

Ответ №8:

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

 MyClass o = null;
o.someMethod();
  

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

например

 Thread t = null;
t.yield();
  

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

Ответ №9:

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

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


подождите, подождите — это компилируется и выполняется:

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

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

Ответ №10:

Нет, нет способа вызвать метод по 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 в вызываемом методе.

[…]