Увидел эту строку в методе класса, и моей первой реакцией было высмеять разработчика, который ее написал ... Но потом я подумал, что сначала должен убедиться, что я прав.
public void dataViewActivated(DataViewEvent e) {
if (this != null)
// Do some work
}
Будет ли эта строка когда-либо считаться ложной?
Ответы:
Нет, не может. Если вы используете
this
, значит, вы находитесь в экземпляре, поэтомуthis
он не равен нулю.JLS говорит:
Если вы вызвали метод из объекта, то объект существует или у вас будет
NullPointerException
ранее (или это статический метод, но тогда вы не можете использоватьthis
).Ресурсы :
this
ключевое словоисточник
this
метод экземпляра может иметь значение NULL. Поэтому я не совсем уверен, что это достаточная причина для Java.foo.bar()
будет выброшено, когдаfoo
будет обнаруженоnull
. это действительно происходит до входа в метод, но на самом деле нет метода, который можно было бы вызвать.this
ключевое слово, и оно компилируется, оно не равно нулю, когда вы его наблюдаете. Но, как говорят другие, это не предотвращает NPE при попытке вызвать метод, например, но это полностью вне вашего контроля как метода, и проверка на null внутри метода ничего не изменит.Это как спрашивать себя: «Я жив?»
this
никогда не может быть нулевымисточник
this != null
было само собой разумеющимся. Это не так - в C ++, например,this
вполне может бытьNULL
, для невиртуального метода.Нет никогда , ключевое слово this само по себе представляет текущий активный экземпляр (объект) этого класса в рамках этого класса, с помощью которого вы можете получить доступ ко всем его полям и членам (включая конструкторы), а также к видимым полям его родительского класса.
И, что более интересно, попробуйте установить его:
Подумай об этом? Как такое возможно, разве это не будет похоже на срезку ветки, на которой вы сидите. Поскольку ключевое слово 'this' доступно в рамках класса, как только вы скажете this = null; в любом месте класса вы в основном просите JVM освободить память, назначенную этому объекту, в середине некоторой операции, которую JVM просто не может допустить, поскольку она должна безопасно вернуться обратно после завершения этой операции.
Более того, попытка
this = null;
приведет к ошибке компилятора. Причина довольно проста: ключевому слову в Java (или любом другом языке) никогда не может быть присвоено значение, т.е. ключевое слово никогда не может быть левым значением операции присваивания.Других примеров не скажешь:
источник
this = null
. Мой экземпляр находился в android, где я хотел удалить представление и установить для объекта, обрабатывающего представление, значение null. Затем я хотел использовать метод,remove()
который удалял бы фактическое представление, а затем объект-обработчик стал бы бесполезным, поэтому я хотел обнулить его.Если вы компилируете с
-target 1.3
или ранее, то внешнийthis
может бытьnull
. Или, по крайней мере, раньше ...источник
Outer.this.member
Нет. Чтобы вызвать метод экземпляра класса, этот экземпляр должен существовать. Экземпляр неявно передается как параметр методу, на который ссылается
this
. Еслиthis
не было ,null
то там бы было ни одного случая , чтобы вызвать метод.источник
Недостаточно того, что язык навязывает это. Виртуальной машине необходимо обеспечить его соблюдение. Если виртуальная машина не применяет его, вы можете написать компилятор, который не будет принудительно проверять значение null перед вызовом метода, написанного на Java. Коды операций для вызова метода экземпляра включают загрузку this ref в стек, см. Http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14787 . Замена этого на нулевое значение действительно приведет к тому, что тест будет ложным.
источник
В методах статического класса
this
не определено, посколькуthis
связано с экземплярами, а не с классами. Я считаю, что попытка использоватьthis
ключевое слово в статическом контексте приведет к ошибке компилятора .источник
Нормальный
this
никогда не может бытьnull
в реальном Java-коде 1 , и в вашем примере используется нормальныйthis
. См. Другие ответы для более подробной информации.Квалифицированного никогда не
this
должно бытьnull
, но это можно сломать. Учтите следующее:Когда мы хотим создать экземпляр
Inner
, нам нужно сделать следующее:Результат:
показывая, что наша попытка создать объект
Inner
соnull
ссылкой наOuter
него не удалась.Фактически, если вы придерживаетесь "чистой Java" оболочки, вы не сможете этого нарушить.
Однако у каждого
Inner
экземпляра есть скрытоеfinal
синтетическое поле (называемое"this$0"
), которое содержит ссылку наOuter
. Если вы действительно коварны, можно использовать «нечистые» средства для присвоенияnull
полю.Unsafe
для этого.В любом случае вы это делаете, конечный результат в том , что
Outer.this
выражение будет вычислятьсяnull
2 .Короче говоря, это возможно для квалифицированного
this
бытьnull
. Но это невозможно, если ваша программа следует правилам "чистой Java".1. Я сбрасываю со счетов такие уловки, как «написание» байт-кодов вручную и выдача их за настоящую Java, настройка байт-кодов с помощью BCEL или подобного, или переход в машинный код и манипуляция с сохраненными регистрами. ИМО, это НЕ Java. Гипотетически такие вещи также могут произойти в результате ошибки JVM ... но я не припоминаю, чтобы каждый видел отчеты об ошибках.
2 - На самом деле JLS не говорит, каким будет поведение, и это может зависеть от реализации ... среди прочего.
источник
Когда вы вызываете метод по
null
ссылке,NullPointerException
он будет брошен из виртуальной машины Java. Это спецификация, поэтому, если ваша виртуальная машина Java строго соответствует спецификации,this
никогда не будетnull
.источник
Если метод статический, значит, его нет
this
. Если метод виртуальный, онthis
не может иметь значение NULL, потому что для вызова метода среда выполнения должна будет ссылаться на vtable с помощьюthis
указателя. Если метод не виртуальный, то да, возможно,this
он нулевой.C # и C ++ допускают невиртуальные методы, но в Java все нестатические методы являются виртуальными, поэтому
this
никогда не будут иметь значение NULL.источник
tl; dr, «this» можно вызвать только из нестатического метода, и все мы знаем, что нестатический метод вызывается из какого-то объекта, который не может быть нулевым.
источник