İnt num = Integer.getInteger ("123") neden NullPointerException atıyor?


Yanıtlar:


212

Büyük resim

Burada oyunda iki konu var:

  • Integer getInteger(String) sandığın şeyi yapmaz
    • nullBu durumda geri döner
  • 'den' Integere atama, intkutunun otomatik olarak açılmasına neden olur
    • Yana IntegerDİR null, NullPointerExceptionatılır

Ayrıştırmak (String) "123"için (int) 123örneğin kullanabilirsiniz int Integer.parseInt(String).

Referanslar

Integer API referansları


Açık 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 veya nullözellik doğru sayısal biçime sahip değilse nulldö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:

İlgili sorular


Autounboxing hakkında

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ırlatabilir NullPointerException. 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.

İlgili sorular


11
Yani 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.
MatrixFrog

5
Bu yorumu gönderir göndermez, Tamsayı sınıfının gerçek kaynağına bakabileceğimi fark ettim! Doğru yoldaydım, ancak bunun 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.
MatrixFrog

Olanlar için kim soruyorsun NEDEN NullPointerException? : programmers.stackexchange.com/questions/158908/…
ROMANIA_engineer

2
@Oracle java.lang.Integer.getInteger (String) 'i kullanımdan kaldırabilir misiniz lütfen?
mjaggard

17

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")

6

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").

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.