2010-08-23 20 views
5

Ben currentRate ve secondCurrentRate Çift nesnelerdir beni rahatsız neden olan aşağıdaki kod parçacığını, doğru tanımlanmış olması:Çift = null bir NullPointerException neden oluyor

(currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null; 

Bu null her her Çift kontrol etmelidir -ness ve null değerini buna göre atayın. Ancak, secondCurrentRate boşsa, bu bir NullPointerException neden olur. Bunun için pasajını değişti:

(currentRate == null | secondCurrentRate == null) ? null : currentRate * secondCurrentRate; 

Ve beklendiği gibi bu çalışır. Sorum şu, bu neden oluyor? Nesneler üzerinde bir yöntem çağırıyor olsaydım anlayabiliyordum, ancak null bir nesne üzerinde bir yöntem çağrıldığında NullPointerExceptions atıldı. Boş bir nesne var ama yöntem çağrısı yok.

Bu konuda herhangi bir fikir sahibi olan var mı? Bu, Java 5'te çalıştırılıyor.

+0

İkinci snippet'inizde "||" veya "|"? –

+1

@ Thierry-Dimitri Roy bu durumda aynı şeydir. –

+0

Lütfen sorunu gösteren kısa ama eksiksiz bir program sağlayın. –

cevap

5

Sorununuzun başka bir yerde olduğunu düşünüyorum.

Double currentRate=null, secondCurrentRate =null; 
    Double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null; 

Ama Bunu yaptıktan bile, bir NPE neden olur::

Bu işleri

Double currentRate=null, secondCurrentRate =null; 
    double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null; 
+0

0 aşağı oy \t Bunu denedim ve derleyici double a = null'a izin vermiyor; Mutlu bir şekilde double = 0.0> 1.0 yazmanıza izin verecek? a: boş; hangi derler ama NPE atar. Bu, burada yaptığınız psişik güç hata ayıklama ;-) – egbokul

+0

Aslında, üçlü operatörle, JVM, null'ı bir 'Double' olarak düşünecek, sonra bir 'double' haline getirecek ve sonra çökecektir :) –

1

koşullu operatör tipi aslında quite complicated olduğunu. Ben senin ilk örnekte ne olur inanmak şudur ki: koşullu ikinci işlenen,

currentRate * secondCurrentRate 

tip double ait olduğunu ve bu da tüm ifadenin türü olur. Sonra, değerlerden biri null olduğunda, ifadenin değerini double içine kutulanmamış olan ve bir NPE'ye neden olan Double null değerine ayarlamaya çalışır.

İkinci ifadenin çalışmasının nedeni, bu durumda koşullu ifadenin biraz farklı anlambiliminden kaynaklanmaktadır.

İlgili konular