Geri mi null instanceof SomeClass
dönecek false
ya da atacak NullPointerException
mı?
Geri mi null instanceof SomeClass
dönecek false
ya da atacak NullPointerException
mı?
Yanıtlar:
Hayır, instanceof komutunu kullanmadan önce bir boş denetime gerek yoktur.
İfadesi x instanceof SomeClass
ise false
eğer x
olduğunu null
.
Java Dil Spesifikasyonu, bölüm 15.20.2, "Tür karşılaştırma operatörü instanceof" :
"Çalışma zamanında, sonucu
instanceof
operatörü olantrue
değeri ise RelationalExpression değildirnull
ve referans için gölgeleri olabilir ReferenceType bir yükseltmedenClassCastException
. Aksi takdirde sonucudurfalse
."
Eğer işlenen boşsa sonuç yanlıştır.
try it
nedeniyle daha doğrudur .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
operatörü neredeyse 20 yıl önce piyasaya sürülen Java 1.0'ın bir parçasıydı. Davranışı şimdi mevcut kodu kıracak şekilde değiştirmek olası değildir, bu büyük maliyetten ağır basan bir fayda yoktur. Yirmi yıl önce, argümanın ortaya çıkabilmesi durumunda doğruyu döndürmek için argümanlar olabilirdi veya boş bir argüman için bir istisna fırlatabilirdi. Ancak bu tanımlar ayrı ayrı kontroller gerektiriyordu.
Gerçekten çok iyi bir soru. Sadece kendim için denedim.
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));
}
}
Baskılar
true
true
false
false
JLS / 15.20.2. Tür Karşılaştırma Operatörü örneği
Çalışma zamanında
instanceof
operatörün sonucutrue
, RelationalExpression değerinin olmamasınull
ve başvurunun a yükseltilmeden ReferenceType'a aktarılabilmesidirClassCastException
. Aksi takdirde sonuç olurfalse
.
API / Sınıf # isInstance (Nesne)
Bu
Class
nesne bir arabirimi temsiltrue
ediyorsa, belirtilenObject
bağımsız değişkenin sınıfı veya herhangi bir üst sınıfı bu arabirimi uygularsa bu yöntem döndürülür ;false
aksi halde geri döner . BuClass
nesne ilkel bir türü temsil ediyorsa , bu yöntem geri dönerfalse
.
s
sadece bir nesne referans değişkendir. Gerçekte var olan bir nesneye ( ""
) atıfta bulunabilir veya null
değişmez bir referansa başvurabilir .
null
hangi değişkeni gösterirse gösterilsin, string veri değildir. örneğin s instanceof String
, aynı değildir field.getType().equals(String.class)
.
s instanceof String
s
"" instanceof String
null instanceof String
Hayır değil. ilk işlenen ise instanceof
dönecekti .false
null
Tıpkı bir tidbit gibi :
Hatta geri döner .(
((A)null)
instanceof A)
false
(Daktilo yazmak null
şaşırtıcı görünüyorsa, bazen bunu yapmak zorundasınız, örneğin böyle durumlarda:
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).
}
}
Böylece Test.test((A)null)
yazdırılacaktır a instanceof A: false
.)
Not: İşe alıyorsanız, lütfen bunu iş görüşmesi sorusu olarak kullanmayın. : D
Hayır . Java değişmez bilgisi null
herhangi bir sınıfın örneği değildir. Bu nedenle herhangi bir sınıf örneği olamaz . instanceof
ya geri döner false
vetrue
bu nedenle <referenceVariable> instanceof <SomeClass>
döner false
zaman referenceVariable
değeri sıfırdır.
instanceof
Operatör açık gerekmez null
bir atmaz olarak, çek NullPointerException
işlenen ise null
.
Çalışma zamanında, instanceof
ilişkisel ifadenin değeri değilse null
ve referans bir sınıf dökümü istisnası yükseltilmeden referans türüne dönüştürülebilirse , operatörün sonucu doğrudur .
İşlenen ise null
, instanceof
operatör geri döner false
ve bu nedenle açık null kontroller gerekmez.
Aşağıdaki örneği düşünün,
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");
}
}
Doğru kullanımı instanceof
aşağıda gösterildiği gibidir,
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");
}
}