Geri mi null instanceof SomeClassdönecek falseya da atacak NullPointerExceptionmı?
Geri mi null instanceof SomeClassdönecek falseya da atacak NullPointerExceptionmı?
Yanıtlar:
Hayır, instanceof komutunu kullanmadan önce bir boş denetime gerek yoktur.
İfadesi x instanceof SomeClassise falseeğer xolduğ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
instanceofoperatörü olantruedeğeri ise RelationalExpression değildirnullve referans için gölgeleri olabilir ReferenceType bir yükseltmedenClassCastException. Aksi takdirde sonucudurfalse."
Eğer işlenen boşsa sonuç yanlıştır.
try itnedeniyle daha doğrudur .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofoperatö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
instanceofoperatörün sonucutrue, RelationalExpression değerinin olmamasınullve başvurunun a yükseltilmeden ReferenceType'a aktarılabilmesidirClassCastException. Aksi takdirde sonuç olurfalse.
API / Sınıf # isInstance (Nesne)
Bu
Classnesne bir arabirimi temsiltrueediyorsa, belirtilenObjectbağı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 ;falseaksi halde geri döner . BuClassnesne ilkel bir türü temsil ediyorsa , bu yöntem geri dönerfalse.
ssadece bir nesne referans değişkendir. Gerçekte var olan bir nesneye ( "") atıfta bulunabilir veya nulldeğişmez bir referansa başvurabilir .
nullhangi 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 Strings"" instanceof Stringnull instanceof String
Hayır değil. ilk işlenen ise instanceofdönecekti .falsenull
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 nullherhangi bir sınıfın örneği değildir. Bu nedenle herhangi bir sınıf örneği olamaz . instanceof ya geri döner falsevetrue bu nedenle <referenceVariable> instanceof <SomeClass>döner falsezaman referenceVariabledeğeri sıfırdır.
instanceofOperatör açık gerekmez nullbir atmaz olarak, çek NullPointerExceptionişlenen ise null.
Çalışma zamanında, instanceofilişkisel ifadenin değeri değilse nullve 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, instanceofoperatör geri döner falseve 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ı instanceofaş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");
}
}