Irá null instanceof SomeClassretornar falseou jogar um NullPointerException?
Irá null instanceof SomeClassretornar falseou jogar um NullPointerException?
Respostas:
Não, uma verificação nula não é necessária antes de usar instanceof.
A expressão x instanceof SomeClassé falsesex é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
instanceofoperador étruese o valor da RelationalExpression não fornulle 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 itporque o comportamento atual não é o mesmo que o comportamento garantido .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofoperador 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
instanceofoperador étruese o valor da RelationalExpression não fornulle a referência poderá ser convertida para o ReferenceType sem gerar aClassCastException. Caso contrário, o resultado éfalse.
API / classe # isInstance (Object)
Se este
Classobjeto representa uma interface, esse método retornatruese a classe ou qualquer superclasse doObjectargumento especificado implementa essa interface; retornafalsecaso contrário. Se esteClassobjeto 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 nullreferência literal (a) .
nullnão são dados de string, não importa qual variável esteja apontando para ele. s instanceof Stringnão é o mesmo que field.getType().equals(String.class), por exemplo.
s instanceof Stringos valores ssão substituídos pelo valor real, para que se tornem "" instanceof Stringe null instanceof String. Pensar assim pode fazer mais sentido.
Não, não é. instanceofretornaria falsese seu primeiro operando for null.
Assim como um petisco :
Mesmo vai voltar .(((A)null)instanceof A)false
(Se a nullimpressã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 nullnão é uma instância de nenhuma classe. Portanto, não pode ser uma instância de nenhuma classe. instanceof retornará um falseou,true portanto, o <referenceVariable> instanceof <SomeClass>retorno falsequando o referenceVariablevalor for nulo.
O instanceofoperador não precisa de nullverificações explícitas , pois não lança a NullPointerExceptionse o operando estivernull .
No tempo de execução, o resultado do instanceofoperador é verdadeiro se o valor da expressão relacional não for nulle 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 instanceofoperador retornará falsee, 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");
}
}