Будет ли null instanceof SomeClass
вернуться false
или бросить NullPointerException
?
java
nullpointerexception
null
Йохан Любке
источник
источник
Ответы:
Нет, проверка нуля не требуется перед использованием instanceof.
Выражение
x instanceof SomeClass
это ,false
еслиx
естьnull
.Из спецификации языка Java, раздел 15.20.2, «Оператор сравнения типов instanceof» :
Так что, если операнд равен нулю, результат ложен.
источник
try it
что текущее поведение не совпадает с гарантированным поведением .Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683instanceof
оператор Java был частью Java 1.0, выпущенной почти 20 лет назад. Изменение поведения таким образом, что это нарушит существующий код, маловероятно, если не будет некоторой выгоды, которая перевешивает эту огромную стоимость. Двадцать лет назад, возможно, могли быть аргументы для возврата истины, если аргумент мог быть приведен, или для исключения нулевого аргумента. Но эти определения потребовали бы отдельных нулевых проверок.Использование нулевой ссылки в качестве первого операнда для
instanceof
возвратаfalse
.источник
Очень хороший вопрос. Я просто попробовал для себя.
Печать
JLS / 15.20.2. Оператор сравнения типов instanceof
API / Class # isInstance (Объект)
источник
s
- это просто ссылка на объект. Он может ссылаться на реально существующий объект (""
) или может ссылаться на ()null
буквальную ссылку.null
не строковые данные, независимо от того, какая переменная указывает на них.s instanceof String
это не то же самое, чтоfield.getType().equals(String.class)
, например.s instanceof String
происходитs
замена на фактическое значение, так что это станет"" instanceof String
иnull instanceof String
. Думая об этом, как это может иметь больше смысла.Нет, это не так.
instanceof
вернется ,false
если его первый операндnull
.источник
Просто как лакомый кусочек :
Даже вернется .
(
((A)null)
instanceof A)
false
(Если приведение типов
null
кажется удивительным, иногда вам приходится делать это, например, в таких ситуациях:Так что
Test.test((A)null)
буду печататьa instanceof A: false
.)PS: Если вы нанимаете, пожалуйста, не используйте это как вопрос собеседования. : D
источник
Нет . Java-литерал
null
не является экземпляром какого-либо класса. Поэтому он не может быть экземпляром какого-либо класса.instanceof
вернет либоfalse
или,true
следовательно,<referenceVariable> instanceof <SomeClass>
возвращает,false
когдаreferenceVariable
значение равно нулю.источник
instanceof
Оператор не нуждается в явныхnull
проверок, так как он не бросать ,NullPointerException
если операндnull
.Во время выполнения результат
instanceof
оператора равен true, если значение реляционного выражения не равноnull
и ссылка может быть приведена к ссылочному типу без вызова исключения преобразования класса.Если операнд есть
null
,instanceof
оператор возвращаетсяfalse
и, следовательно, явные проверки на ноль не требуются.Рассмотрим приведенный ниже пример,
Правильное использование,
instanceof
как показано ниже,источник