#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
в вызываемом методе.[…]