2016-04-05 31 views
-4

tespit edemez aşağıdaki adres kod parçası:NullPointerException ben

List<SomeObject> allObjects = getNotNullCollection(SomeObject.class, getExpression()); 
Enumeration2Child mightBeNull = getEnumeration2(); 
try { 
    for (SomeObject someObject : allObjects) { 
     if (someObject == null) { 
      LOGGER.warn("Null Object " + getId() + " expression : " + getExpression().toString()); 
      StringBuilder errorMsg = new StringBuilder(); 
      for (Object element : allObjects) { 
       errorMsg.append(element != null ? element.toString() : "Null").append(" - "); 
      } 
      LOGGER.warn("allObjects: ", errorMsg.toString()); 
      return false; 
     } 
     if (someObject.getValue() != null && someObject.getValue().equals(Enumeration1.VALUE) && !(Enumeration2.VALUE2.equals(mightBeNull) || Enumeration2.VALUE3.equals(mightBeNull))) { 
      return false; 
     } 
    } 

} catch (NullPointerException e) { 

} 

Ve bir NPE hattında orada atılır: someObject boş olup olmadığını kontrol yukarıdaki i de, görebileceğiniz gibi

if (someObject.getValue() != null && someObject.getValue().equals(Enumeration1.VALUE) && !(Enumeration2.VALUE2.equals(mightBeNull) || Enumeration2.VALUE3.equals(mightBeNull))) 

someObject.getValue() öğesinin boş olup olmadığını kontrol et, bu yüzden bu bölümde güvenli olmalıyım. Ve geri kalan ifadelerin geri kalanı sadece eşittir çağrılarıdır (ve sonra eşittir yönteminde NPE alacağımı varsayalım ve eğer ifadede değil). Başka neyim olsun burada özlüyorum? Teşekkür ederiz

DÜZENLEME: Merhaba, sorunu çözmek için bize bilgi vermek. Gerçekten haklıydın, çok önemli bir bilgi fark etmedim ama başlangıçta araştırmak zordu. Ek kayıt ekledim ve aynı kodu çalıştıran 3 iş parçacığı olduğunu öğrendim. Şimdi, bu bir sorun olmayacak, ancak allObjects döndüren DB önbelleğe alma getExpression() uygulamasının uygulanmasıyla, bu iş parçacıkları arasında paylaşıldı. Biri bu parçadaki boş değerlere karşı denetlerken: ( 'if (someObject.getValue()! = Null & & someObject.getValue().' ilk onay döndü değil Null ve sonra başka bir iş parçacığı silindi, dolayısıyla NPE oldu someObject.getValue() tarafından atılan. Yani temelde

+2

Tanımlamak için bize yeterince bilgi verdiğinizi düşünmüyorum ya. Bunu okudun mu? http://stackoverflow.com/q/218384/3973077 –

+0

Ayrıca 'Enumeration1.VALUE' veya 'mightBeNull' ** kontrol edebilirsiniz ** null nedir? –

+1

En azından çağrı grubunu dahil etmelisiniz. – Reinard

cevap

1

NPES sadece tarafından atılabilen bir eşzamanlılık sorunu '' bir nesneyi dereferences (nokta operatörü). bu çizginin baktığımızda, 6 değişken olduğunu sen Gördüğüm null olup olmadığına bakalım: Enumeration1, Enumeration2 ve Enumeration3 ve her biri için VALUE. Eğer NPE eşittir içine atılmışsa, o satırı görürsünüz.

olarak aşağıda açıklamada belirtildiği gibi, istisnalar Buna vardır:

  1. açıkça yığın izleme atmak deyimi doğrultusunda işaret eder ki bu durumda bir NullPointerException atarsam.
  2. otomatik kutulama, NPE’lere neden olabilir. Esasen, '.' derlenen kod için nokta operatörleri. Bu kötü olabilir. Benim deneyimime göre, yığın izi, kodun (IIRC kaynağının 1. satırı) olmadığı garip bir yerden atılma özel durumunu gösterecektir.
+2

"NPE'ler yalnızca 'tarafından atılabilir." (nokta operatörü) "Bu doğru değil. Yeni NullPointerException() 'a atmak, içinde hiç nokta yok, ne de Integer v = null; v * = 2; –

+0

Doğru, ancak Enumaration değerleri kodumdaki statik alanlardır. – guruk

+0

statik alanlar, null olarak ayarlanabilir. Bunu kodun içine eklemeyi deneyin: 'System.out.println (" any null? "+ (Enumeration1 == null || Enumeration2 == null || Enumeration3 == null)); – JimmyJames

İlgili konular