Aşağıdaki kod atar NullPointerException
:
int num = Integer.getInteger("123");
Derleyicim getInteger
statik olduğundan null üzerinde mi çağırıyor ? Bu hiç mantıklı değil!
Ne oluyor?
Aşağıdaki kod atar NullPointerException
:
int num = Integer.getInteger("123");
Derleyicim getInteger
statik olduğundan null üzerinde mi çağırıyor ? Bu hiç mantıklı değil!
Ne oluyor?
Yanıtlar:
Burada oyunda iki konu var:
Integer getInteger(String)
sandığın şeyi yapmaz
null
Bu durumda geri dönerInteger
e atama, int
kutunun otomatik olarak açılmasına neden olur
Integer
DİR null
, NullPointerException
atılırAyrıştırmak (String) "123"
için (int) 123
örneğin kullanabilirsiniz int Integer.parseInt(String)
.
Integer
API referanslarıInteger.getInteger
İşte bu yöntemin ne yaptığına dair belgelerin söylemesi gerekenler:
public static Integer getInteger(String nm)
: Belirtilen ada sahip sistem özelliğinin tamsayı değerini belirler. Belirtilen ada sahip bir özellik yoksa, belirtilen ad boşsa veyanull
özellik doğru sayısal biçime sahip değilsenull
döndürülür.
Başka bir deyişle, bu yöntemin a'yı String
bir int/Integer
değere ayrıştırmakla ilgisi yoktur , bunun yerine System.getProperty
yöntemle ilgisi vardır .
Kuşkusuz bu oldukça sürpriz olabilir. Kütüphanenin böyle sürprizleri olması talihsiz bir durum, ancak size değerli bir ders veriyor: bir yöntemin ne işe yaradığını doğrulamak için her zaman dokümantasyona bakın.
Tesadüfen, bu problemin bir varyasyonu, Return of the Puzzlers: Schlock and Awe (TS-5186) , Josh Bloch ve Neal Gafter'ın 2009 JavaOne Technical Session sunumunda yer aldı. İşte sonuç slaytı:
Ahlak
- Kütüphanelerde garip ve korkunç yöntemler pusuda
- Bazılarının zararsız sesleri var
- Kodunuz yanlış davranıyorsa
- Doğru yöntemleri aradığınızdan emin olun
- Kitaplık belgelerini okuyun
- API tasarımcıları için
- En az şaşkınlık ilkesini ihlal etmeyin
- Soyutlama hiyerarşisini ihlal etmeyin
- Çılgınca farklı davranışlar için benzer isimler kullanmayın
Tamlık için, aşağıdakilere benzer yöntemler de vardır Integer.getInteger
:
Bir diğer konu ise tabii ki nasıl NullPointerException
fırlatılacağı. Bu konuya odaklanmak için, snippet'i aşağıdaki gibi basitleştirebiliriz:
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
İşte Effective Java 2nd Edition, Item 49'dan bir alıntı: Kutulu primitiflere ilkel türleri tercih et:
Özetle, seçiminiz olduğunda kutulu ilkel yerine ilkelleri kullanın. İlkel türler daha basit ve daha hızlıdır. Kutulu ilkelleri kullanmanız gerekiyorsa, dikkatli olun! Otomatik kutulama, kutulu temelleri kullanmanın ayrıntı düzeyini azaltır ancak tehlikeyi azaltmaz. Programınız iki kutulu ilkeli
==
operatörle karşılaştırdığında, bir kimlik karşılaştırması yapar, ki bu neredeyse kesinlikle istediğiniz şey değildir. Programınız kutulu ve kutulu olmayan ilkelleri içeren karma tip hesaplamalar yaptığında, kutudan çıkarma yapar ve programınız kutudan çıkarma yaptığında fırlatabilirNullPointerException
. Son olarak, programınız ilkel değerleri kutu içine aldığında, maliyetli ve gereksiz nesne yaratımlarına neden olabilir.
Kutulu ilkelleri kullanmaktan başka seçeneğiniz olmayan yerler vardır, örneğin jenerikler, ancak aksi takdirde kutulu ilkelleri kullanma kararının haklı olup olmadığını ciddi olarak düşünmelisiniz.
Integer.getInteger(s)
kabaca eşdeğer Integer.parseInt(System.getProperty(s))
mi? Sanırım ikincisini daha ayrıntılı olmasına rağmen tercih ederim, çünkü sistem özelliklerinden bilgi aldığınızı vurguluyor.
Integer.decode
yerine, Integer.parseInt
bir satır aralığı arar 0x
veya 0
sayıyı sırasıyla onaltılık veya sekizlik olarak ayrıştırmak için kullanması dışında doğru yoldaydım.
NullPointerException
? : programmers.stackexchange.com/questions/158908/…
Http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html adresinden :
getInteger 'Belirtilen ada sahip sistem özelliğinin tamsayı değerini belirler.'
Bunu istiyorsun:
Integer.parseInt("123")
Lütfen getInteger () yönteminin belgelerine bakın . Bu yöntemde String
parametre, belirtilen adla sistem özelliğinin tamsayı değerini belirleyen bir sistem özelliğidir. "123", burada tartışıldığı gibi herhangi bir sistem özelliğinin adı değildir . Bu String'i dönüştürmek istiyorsanız int
, yöntemi kullanın
int num = Integer.parseInt("123")
.