2016-06-07 61 views
9

Java'da bir null başvurusunda neden referans oluşturulmasının bir nedeni var mı? bu muhtemelen doğru asla ama daha sonra bulmak zor hatalara neden olabilir yapmak:Bir null başvuruda bir yöntem başvurusu oluşturma bir istisna atar

public class Test { 
    void m() { 
    } 

    public static void main(String[] args) { 
     Test test = null; 
     Runnable fn = test::m; // no exception 
     System.out.println(fn); // prints Test$$Lambda$1/[email protected] 
     fn.run(); // throws a null pointer exception 
    } 
} 
+5

Eclipse ile test ediyorsunuz? JDK 1.8.0_51 ile test ettim ve beklendiği yerde NPE'yi atar. Bu muhtemelen şu soruyu yanıtlar: http://stackoverflow.com/questions/37413106/thread-setuncaughtexceptionhandler-and-java-8-method-reference/. Çünkü bir NPE'yi Runnable fn = test :: m'de atmalıdır. – Tunaki

+0

Bu soruyu konu dışı olarak kapatmaya oy veriyorum çünkü mevcut olmayan davranışları soruyor. –

+0

@Tunaki evet Eclipse'de test ettim ve son satır – Michael

cevap

11

o Java bir null referansa yöntem başvuruları oluşturmak mümkün olmasının bir nedeni var mı?

O değil, ama görünüşe göre bu konuda (düzenleme: been fixed beri vardır) içinde Eclipse bir hata var. Belirtime göre ve JDK'nın araçlarını kullandığınızda, Runnable fn = test::m; satırında bir NPE ile başarısız olur.

Dayanıklı: http://ideone.com/APWXna (veya derleme ve javac ve java yerine Eclipse ile yerel olarak çalıştırın)

Teorik: JLS §15.13.3 kaynaktan:

İlk olarak, yöntem, referans ifade bir ExpressionName başlıyorsa veya bir Birincil, bu alt ekspresyon değerlendirilir. Alt-ifade null olarak değerlendirilirse, NullPointerException yükseltilir ve yöntem başvuru ifadesi aniden tamamlanır.

(My vurgu.)

+0

Bu hata Eclipse'e bildirildi mi? –

+1

@DidierL: Hiçbir fikrim yok, Eclipse kullanmıyorum. –

+1

Bu sorun https://bugs.eclipse.org/bugs/show_bug.cgi?id=521182 adresinde ele alınmıştır. – bjmi