2013-04-26 31 views
15

Bu, sanırım bence püristler için bir tane. Son zamanlarda, bir Boolean'a String değerlerinin özel ayrıştırma işlemini gerçekleştirmek için bir yöntemle ilgili bir sorun yaşadım. Basit yeterli bir görev ama boş durumda bir NullPointerException atma yöntemi altındaydı nedense ...NullPointerException, Boolean'dan

static Boolean parseBoolean(String s) 
{ 
    return ("1".equals(s) ? true : ("0".equals(s) ? false : null)); 
} 

Boole öyleyse neden nasıl bir NullPointerException atılmış olabilir veya yöntem için döndürme türü nedir? Hata ayıklamadan, iç içe satır içi koşullu ifadenin null olarak değerlendirdiği ve dış satır içi koşullu duruma döndürdüğü noktada istisna atılıyor gibi görünüyor, ancak yine de nedenini açıklayamıyorum.

static Boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 
    if ("0".equals(s)) return false; 

    return null; 
} 

Aşağıdaki kodu da ikisi arasında yarım yoludur ve çalışmaları beklendiği gibi: beklendiği gibi çalıştığını, hangi şöyle

Sonunda yöntemi pes edip yeniden yazdım

static Boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 

    return "0".equals(s) ? false : null; 
} 
+2

+1 için güzel "bilinmez" – NilsH

+0

@NilsH sayesinde 1 ve çözüm için! – Robin

cevap

13

Bu aynı zamanda çalışır:

static Boolean parseBoolean(String s) 
{ 
    return ("1".equals(s) ? Boolean.TRUE : ("0".equals(s) ? Boolean.FALSE : null)); 
} 

Yani bir NPE üçlü operatörü boolean kullanarak ifadenin sonucu bir boolean muamelesi neden olur çünkü Autoboxing nedeniyle olsun sebep. Ve null'un kutunun kaldırılması bir NPE'ye neden olur.

+1

+1 Aferin. Biri kodun ne olduğunu düşünmüyor. –

+0

İyi cevap @Nils - bu kaygan küçük şeytan! Boolean sabitlerini kullanmayı düşünmemiştim. – Robin

8

Benim öneri? , Boolean dönmek boolean dönmek ve bir istisna atmayın: Yukarıdaki yanlışlıkla boş Boolean nesneye başvuran önlemeye yardımcı olacak gibi bir yaklaşım izlenmesi

static boolean parseBoolean(String s) 
{ 
    if ("1".equals(s)) return true; 
    if ("0".equals(s)) return false; 

    throw new IllegalArgumentException(s + " is not a boolean value."); 
} 

.

orijinal yöntem istisna atıyor neden excellent answer from NilsH görmek bakın.

+1

Katılıyorum. Daha sonra bir NPE'ye koşmaktan daha hızlı başarısız olmak daha iyidir. Bir Boolean'ın “üç durumlu” bir çözüme ihtiyacı varsa, kullanımları vardır. – NilsH

+0

Bu üç durumlu bir durumdur, bu yüzden beklenen değerler için istisnalar yapmamalıyım! Ayrıca, daha fazla ele alma istisna değil daha pahalı? – Robin

2

İlginç ama bu ilk etapta bunun neden hiçbir cevap, ileride söyler.

Bu, üçlü ifadeyle ilgilidir.

Derleyici, null olarak Boolean için boş bir başvuru olarak yorumluyor, Boolean için otomatik kutulama/kutuklama kurallarını uygular (bir boş) => çalışma zamanında bir NullPointerException alırsınız.

+2

Cevapları yeniden okumak zorunda olduğunuzu düşünüyorum;) – NilsH

+1

@NilsH muhtemelen yazdığınız sırada bu bölümünüzü kaçırdı. :) benden +1. – Eugene