Aşağıdaki kod atar NullPointerException:
int num = Integer.getInteger("123");
Derleyicim getIntegerstatik 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 getIntegerstatik 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
nullBu durumda geri dönerIntegere atama, intkutunun otomatik olarak açılmasına neden olur
IntegerDİR null, NullPointerExceptionatı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ğilsenulldöndürülür.
Başka bir deyişle, bu yöntemin a'yı Stringbir int/Integerdeğere ayrıştırmakla ilgisi yoktur , bunun yerine System.getPropertyyö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 NullPointerExceptionfı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.decodeyerine, Integer.parseIntbir satır aralığı arar 0xveya 0sayı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 Stringparametre, 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").