2015-04-14 29 views
21

atlar, aşağıdaki kod normalde derler:Üçlü ifadesi bazen derleyici kontrolleri doğrulamaları Nedense

public double getSomeDouble() { 
    return "" != null ? 3.7d : null; 
} 

Normalde Eclipse bir hata olarak işaretlemek beklenir (null bir double ilkel döndü olamaz).

Sadece benim varsayım geri bu kod işe yaramaz:

public double getSomeDouble() { 
    return null; 
} 

Eclipse hata olarak return null hattını işaretlemek olacaktır belirterek:

Tür uyumsuzluğu: double

için null dönüştüğünde olamaz

Neden önceki kod snippet'inde aynı şey yazmıyor ?!

+0

(http://stackoverflow.com/q/8098953/1391249) – Tiny

cevap

23

autoboxing ve autounboxing nedeniyle. Bayt kodu (aşağıdaki) bakarsanız, Double.valueOf (3.7d numaralı kutuyu işaretleme) ve Double#doubleValue numaralı çağrıları görebilirsiniz (koşullu ifadenin sonucunun çıkarılması). derleyici etkin bir bu işe kodunuzu çeviriyor böylece koşullu operatöre operandlar, aynı türde olmalıdır: en belirli yaygın türüdür

public double getSomeDouble() { 
    return ("" != null ? Double.valueOf(3.7d) : null).doubleValue(); 
} 

... Double çünkü 3.7d ve null için bulabilirsiniz. etkin bir hale gelir

public double getSomeDouble(String str) { 
    return str != null ? 3.7d : null; 
} 

:

I (gerçek asla derleyici söylemek mümkün olacaktır değişmez ifadesi "" != null etrafında derleyici optimizasyon ortadan kaldırmak için) bir dize argümanı kullanılır

public double getSomeDouble(String str) { 
    return (str != null ? Double.valueOf(3.7d) : null).doubleValue(); 
} 

... ve null üzerinde doubleValue() aramayı denediğinde, için null geçirdiğimde çalışma zamanında bir NPE var. İşte

baytkodu var benim getSomeDouble(String) ( javap -c MyClass itibaren): [? İlgili]

 
    public double getSomeDouble(java.lang.String); 
    Code: 
     0: aload_1 
     1: ifnull  13 
     4: ldc2_w  #7     // double 3.7d 
     7: invokestatic #9     // Method java/lang/Double.valueOf:(D)Ljava/lang/Double; 
     10: goto   14 
     13: aconst_null 
     14: invokevirtual #10     // Method java/lang/Double.doubleValue:()D 
     17: dreturn 
+4

hata nedeni şimdi açık olmasına rağmen, ben hala benim için onları izlemek için eclipse derleyici ayarlamak istiyorum (çok geç olan çalışma zamanı :(), bir yol biliyor musunuz? –

+2

https://bugs.eclipse.org/bugs/show_bug.cgi?id= 163065 – Guillaume

+0

@MaximRahlis: Korkarım öyle değil. Guillaume'in izlemek isteyebileceğiniz bir özellik isteğini bulmuş gibi görünüyor ... –