Irá null instanceof SomeClass
retornar false
ou jogar um NullPointerException
?
Irá null instanceof SomeClass
retornar false
ou jogar um NullPointerException
?
Respostas:
Não, uma verificação nula não é necessária antes de usar instanceof.
A expressão x instanceof SomeClass
é false
sex
énull
.
Na Especificação da linguagem Java, seção 15.20.2, "Digite operador de comparação de instância" :
"No tempo de execução, o resultado do
instanceof
operador étrue
se o valor da RelationalExpression não fornull
e a referência puder ser convertida no ReferenceType sem gerar aClassCastException
. Caso contrário, o resultado seráfalse
."
Portanto, se o operando for nulo, o resultado será falso.
try it
porque o comportamento atual não é o mesmo que o comportamento garantido .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
operador do Java fazia parte do Java 1.0, lançado há quase 20 anos. É improvável mudar o comportamento agora de uma maneira que interrompa o código existente, sem alguns benefícios que superem esse enorme custo. Vinte anos atrás, talvez houvesse argumentos para retornar true se o argumento pudesse ser lançado ou lançar uma exceção para um argumento nulo. Mas essas definições teriam exigido verificações nulas separadas.
Muito boa pergunta, de fato. Eu apenas tentei por mim mesmo.
public class IsInstanceOfTest {
public static void main(final String[] args) {
String s;
s = "";
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
s = null;
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
}
}
Impressões
true
true
false
false
JLS / 15.20.2. Operador de comparação de tipo instanceof
No tempo de execução, o resultado do
instanceof
operador étrue
se o valor da RelationalExpression não fornull
e a referência poderá ser convertida para o ReferenceType sem gerar aClassCastException
. Caso contrário, o resultado éfalse
.
API / classe # isInstance (Object)
Se este
Class
objeto representa uma interface, esse método retornatrue
se a classe ou qualquer superclasse doObject
argumento especificado implementa essa interface; retornafalse
caso contrário. Se esteClass
objeto representar um tipo primitivo, esse método retornaráfalse
.
s
é apenas uma variável de referência de objeto. Ele pode se referir a um objeto realmente existente ( ""
) ou a uma null
referência literal (a) .
null
não são dados de string, não importa qual variável esteja apontando para ele. s instanceof String
não é o mesmo que field.getType().equals(String.class)
, por exemplo.
s instanceof String
os valores s
são substituídos pelo valor real, para que se tornem "" instanceof String
e null instanceof String
. Pensar assim pode fazer mais sentido.
Não, não é. instanceof
retornaria false
se seu primeiro operando for null
.
Assim como um petisco :
Mesmo vai voltar .(
((A)null)
instanceof A)
false
(Se a null
impressão tipográfica parecer surpreendente, às vezes você precisará fazer isso, por exemplo, em situações como esta:
public class Test
{
public static void test(A a)
{
System.out.println("a instanceof A: " + (a instanceof A));
}
public static void test(B b) {
// Overloaded version. Would cause reference ambiguity (compile error)
// if Test.test(null) was called without casting.
// So you need to call Test.test((A)null) or Test.test((B)null).
}
}
O mesmo Test.test((A)null)
será impresso a instanceof A: false
.)
PS: Se você estiver contratando, não use isso como uma pergunta de entrevista de emprego. : D
Não . O literal Java null
não é uma instância de nenhuma classe. Portanto, não pode ser uma instância de nenhuma classe. instanceof
retornará um false
ou,true
portanto, o <referenceVariable> instanceof <SomeClass>
retorno false
quando o referenceVariable
valor for nulo.
O instanceof
operador não precisa de null
verificações explícitas , pois não lança a NullPointerException
se o operando estivernull
.
No tempo de execução, o resultado do instanceof
operador é verdadeiro se o valor da expressão relacional não for null
e a referência puder ser convertida para o tipo de referência sem gerar uma exceção de conversão de classe.
Se o operando for null
, o instanceof
operador retornará false
e, portanto, verificações nulas explícitas não serão necessárias.
Considere o exemplo abaixo,
public static void main(String[] args) {
if(lista != null && lista instanceof ArrayList) { //Violation
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}
O uso correto de instanceof
é como mostrado abaixo,
public static void main(String[] args) {
if(lista instanceof ArrayList){ //Correct way
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}