Является ли это возможным?
Object obj=null;
obj.someMethod();
someMethod{/*some code here*/}
Является ли это возможным?
Object obj=null;
obj.someMethod();
someMethod{/*some code here*/}
Вы можете вызвать статический метод для нулевого указателя. Указатель, естественно, будет полностью проигнорирован при вызове статического метода, но это все же тот случай, когда что-то, что (не глядя на определение класса), по-видимому, должно вызывать исключение 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/что-то еще внутри самого метода.
static
из такой переменной почти всегда считается плохим стилем: он подразумевает отношение, когда его нет.
- person Joachim Sauer; 02.05.2011
Нет мы не можем. он будет вызывать исключение NullPointerException, если метод не является статическим. Если метод статический, он будет работать.
Прочитайте это: null: Глоссарий Java
Нет. В Java null не является объектом.
Переменная «obj» не ссылается ни на один экземпляр в куче. По этой причине вы получите исключение nullpointerException во время выполнения. Даже ваша Java IDE (Eclipse, IDEA) уловит проблему и предупредит вас об этом.
да, вы можете вызвать, если метод является статическим, потому что статический метод связывается во время компиляции, и для статической привязки используется только тип переменной, а не значение объекта.
если вы попробуете то же самое для нестатического метода, будьте готовы поймать исключение нулевого указателя.
ты не можешь выполнить
null.someMethod(); !!!
((ClassWithStaticMethod) null).someMethod()
отлично работает ;-)
- person aioobe; 02.05.2011
Это всегда будет генерировать NullPointerExcpetion
, если только некоторый метод не объявлен статическим. Однако вызов статических методов для экземпляра — очень плохая практика.
Это не скомпилируется, так как Object не имеет someMethod()
. Однако, если вы говорите о чем-то вроде
MyClass o = null;
o.someMethod();
ответ зависит от того, является ли someMethod статическим или нет. Если оно статично, значение игнорируется, и не имеет значения, является ли оно нулевым или нет.
e.g.
Thread t = null;
t.yield();
работает нормально без исключения.
Нулевой объект не существует. В вашем примере у вас есть переменная (указатель), которая может либо хранить ссылку на экземпляр, либо ничего.
Если он не указывает на экземпляр — ну, тогда мы не можем использовать его для вызова методов или доступа к полям.
подождите, подождите — это компилируется и запускается:
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();
}
}
Соответствующая цитата из JLSа>:
15.12.4.4 Поиск метода для вызова
Стратегия поиска метода зависит от режима вызова.[...]
Если режим вызова
static
, ссылка на цель не требуется, и переопределение не допускается. Вызывается методm
классаT
.В противном случае должен быть вызван метод экземпляра и имеется целевая ссылка. Если целевой ссылкой является
null
, в этой точке создаетсяNullPointerException
. В противном случае считается, что целевая ссылка ссылается на целевой объект и будет использоваться в качестве значения ключевого словаthis
в вызываемом методе. .[...]
NullPointerException
. - person Péter Török   schedule 02.05.2011