İstisnada null Boolean öğesinin doğru olup olmadığını kontrol edin


169

Takip koduna sahibim:

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}

Neden Boole değişkeni "bool" üzerinde yaptığım denetleme bir istisna ile sonuçlanıyor? Doğru olmadığını "gördüğünde" sadece if ifadesini geçmemeli midir? İf deyimini kaldırdığımda veya boş değilse kontrol ettim, istisna ortadan kalkar.


3
Nesnenin kutudan çıkarılması ile ilgili yukarıdaki cevapların hepsi doğrudur. Bununla birlikte, tamlık uğruna, nesne paketleyici "Boolean" yerine ilkel "boolean" kullanmak için kodunuzu da değiştirebilirsiniz. Ayrıca ilkel ve Nesne arasındaki fark konusunda kendinizi yenilemeniz gerekir.
Marvo

Bu arada ... if (bool == Boolean.TRUE)bir istisna oluşturmadan yanlışları değerlendirir. Bulduğum durumda bunun kasıtlı olup olmadığından emin değilim.
simon.watts

2
@ için yanlış olur simon.watts boololmak nullVeya eğer Boolean(referans olarak ve açık bir şekilde inşa edilmiştir Boolean.TRUE). Bu yüzden tavsiye edilmez; aksine değerlerin if (Boolean.TRUE.equals(bool))güvenli bir şekilde ele alınması da dahil olmak üzere beklendiği gibi çalışacaktır null.
StaxMan

Yanıtlar:


171

Bir sahip booleanolduğunuzda ya trueya olabilir false. Yine de, sahip Booleanolduğunuzda Boolean.TRUE, Boolean.FALSEya nullbaşka bir nesne olabilir.

Sizin özel durumda, senin Booleanolduğunu nullve ifdeyim bir örtük dönüştürme tetikler booleanolduğunu üretir NullPointerException. Bunun yerine ihtiyacınız olabilir:

if(bool != null && bool) { ... }

23
Teknik olarak a Boolean, sadece değil, herhangi bir sayıda gerçek örnek olabilir Boolean.TRUE. Örneğin new Boolean(true).
Steve Kuo

1
Neden anlamak için mücadele if (myBoolean)(burada myBooleanolduğu Booleanbir derleyici hatası ya da en azından bir uyarı yükseltmek değildir). Bu kesin bir şey.
Josh M.

1
@JoshM. Java yapar Bunun nedeni Boks ve Unboxing : sarmalayıcıların docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Vinicius

3
@Vinicius emin, ama derleyici en azından bir derleyici uyarısı yoluyla bu durumda bizim için boş yapmalıdır.
Josh M.

2
@JoshM. Daha fazla katılıyorum :)
Vinicius

402

Ekstra null kontrolleri sevmiyorsanız:

if (Boolean.TRUE.equals(value)) {...}

1
@AvrDragon: eşittir gerekli mi? Operatör == burada çalışıyor çünkü Boole sadece iki değere sahip
Atul

7
@Atul Evet, burada eşittir gereklidir. Çünkü (new Boolean (true) == new Boolean (true)) yanlıştır. Sebep: Boolean sadece bir sınıftır ve java'daki diğer sınıflar gibi birden çok örneğe sahip olabilir.
AvrDragon

35
Evet, bu bir utanç, inşaatçı özel olmalı, bu yüzden bir twingleton olduğundan emin olun ...
fortran

15
"twingleton" için @fortran +1.
Bennett McElwee

1
Bu deyim üzerinde Apache BooleanUtils kullanmanın kesinlikle bir anlamı yok.
StaxMan

82

Apache BooleanUtils kullanın .

(En yüksek performans projenizdeki en önemli öncelikse, harici bir kütüphane dahil edilmesini gerektirmeyen yerel bir çözüm için diğer yanıtlardan birine bakın.)

Tekerleği yeniden icat etme. Yapılmış olanlardan yararlanın ve kullanın isTrue():

BooleanUtils.isTrue( bool );

Çekler bir eğer Booleandeğer taşıma, doğrudur nulldönerek false.

Eklemenize izin verilen kitaplıklar ile sınırlı değilseniz, Booleansve dahil olmak üzere her türlü kullanım durumu için bir sürü harika yardımcı işlev vardır Strings. Çeşitli Apache kütüphanelerini incelemenizi ve sunduklarını görmenizi öneririm.


59
Alternatif bu kadar basit bir şey için harici bir kütüphane kullanıyorsa, tekerleği yeniden icat etmek o kadar da kötü görünmüyor.
Paul Manta

3
Bu sen tek şey ise @PaulManta ben kabul şimdiye Apache Utils kitaplıklarında kullanmak, ancak önerilen fikri kütüphaneleri "incelemek" diğer yardımcı fonksiyonları kendinizi maruz etmektir.
Joshua Pinter

1
Bu kütüphaneleri kullanmak için performans cezası vardır. Bu nedenle, dilin bir parçası olan bu tür temel şeyler için kütüphaneleri kullanmamalısınız.
ACV

6
Bu kütüphane tekerleği yeniden icat ediyor. Bu tür kütüphanelerden mümkün olduğunca kaçınmaya çalışıyorum.
mschonaker

3
@mschonaker Apache BooleanUtils tekerleği yeniden keşfediyorsa, orijinal tekerlek nedir? Buradaki fikir, bunun gibi kütüphanelerde yapılmış olanları taklit eden bir grup yardımcı işlev oluşturmaktan kaçınmaktır. toStringYesNoTüm kütüphanelerimde de bu kütüphaneden kullanıyorum .
Joshua Pinter

13

Booleantürleri olabilir null. nullAyarladığınız gibi bir kontrol yapmanız gerekir null.

if (bool != null && bool)
{
  //DoSomething
}                   

3
Bu cevapta yanlış olan ne? İstisna fırlatacak olan boolun kontrolü değil. Gereksiz downvotes.
dodexahedron

2
Bunun makul bir cevap olduğuna katılıyorum. Yine de istisna işlemeden kurtulabilirsiniz.
Marvo

14
İstisna teslimi gereksizdir ve bunun yanında yeni başlayanlar için kötü bir örnek olarak yapılır. Bu bir düşüş hakkını hak ediyor, IMO. (Evet ... Örnek koddan geldiğini biliyorum, ancak Cevapta tekrarlamak onu onaylıyor gibi görünüyor.)
Stephen C

1
O zaman doğru yol nedir? Cevabınızı burada görmüyorum.
Marvo

5
Doğru yol yukarıdaki ... istisna işleme. Ayrıca, İstisna işleme çok geneldir ve önerilmez.
vellvisher

8

Veya Java 8 İsteğe Bağlı'nın gücüyle, böyle bir numara da yapabilirsiniz:

Optional.ofNullable(boolValue).orElse(false)

:)


5

Boolean, ilkel boolean için nesne sarma sınıfıdır. Bu sınıf, herhangi bir sınıf gibi, aslında boş olabilir. Performans ve bellek nedeniyle ilkel kullanmak her zaman en iyisidir.

Java API'sindeki sarmalayıcı sınıfları iki temel amaca hizmet eder:

  1. Temel öğelerin Koleksiyonlara eklenmesi veya nesne dönüş değeri olan bir yöntemden döndürülmesi gibi nesneler için ayrılan etkinliklere dahil edilebilmesi için bir nesnede ilkel değerleri “sarmak” için bir mekanizma sağlamak.
  2. İlkellere yönelik faydalı fonksiyonların bir çeşitliliğini sağlamak. Bu işlevlerin çoğu çeşitli dönüştürmelerle ilgilidir: ilkelleri String nesnelerine ve String nesnelerine dönüştürme ve ilkel ve String nesnelerini ikili, sekizli ve onaltılık gibi farklı tabanlara (veya sayıya) dönüştürme.

http://en.wikipedia.org/wiki/Primitive_wrapper_class


0

değişken bool bir null işaret ettiği için, her zaman bir NullPointerException alırsınız, değişkeni önce null değeri olmayan bir yerde başlatmanız ve sonra değiştirmeniz gerekir.


1
Sadece bu catcholsaydı , blok NullPointerException işleyecekti. Buradaki sorun, OP'nin bir ilkeye bir boş referansı açmaya çalışmasıdır.
Mike Adler

"her zaman olacak" - Her zaman değil, örnek dışında, değişkenin başlatılması ile nulltest edilmesi arasında hiçbir şey yapmayan basitleştirilmiş kod . Muhtemelen gerçek kod o kadar basit ifolamazdı veya tüm test kaldırılabilirdi.
nnnnnn
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.