2012-11-28 22 views
49

İyi bir programlama uygulaması olduğuna inanıyorum çünkü, bir kez yazılmak isteniyorsa, tüm (yerel veya örnek) değişkenlerimi final yapıyorum.Try/catch ile son değişken ataması

Ancak, değişken atama istisna atabilir zaman nihai değişken söyledi yapmak olamayacağını fark:

final int x; 
try { 
    x = Integer.parseInt("someinput"); 
} 
catch(NumberFormatException e) { 
    x = 42; // Compiler error: The final local variable x may already have been assigned 
} 

geçici bir değişkene başvurmadan bunu yapmanın bir yolu var mı? (veya bu son değiştirici için doğru yer değil mi?)

+1

Geçici bir değişken olmadan bunu yapabileceğinizi sanmıyorum. – NPE

+8

' son int x = makeX(); 'kesinlikle. (işlevde yakalama) –

+2

JDK'nın [hala bir tryparse' içermiyor] şok edici (http://stackoverflow.com/questions/1486077/java-good-way-to-encapsulate-integer-parseint) . –

cevap

44

Bunu yapmanın bir yolu, (final) geçici değişkeni tanıtmaktır, ancak bunu yapmak istemediğini söylemiştiniz.

başka yolu da bir işlev içine kodunun iki dalları taşımaktır:

bu pratik olsun ya da olmasın
final int x = getValue(); 

private int getValue() { 
    try { 
    return Integer.parseInt("someinput"); 
    } 
    catch(NumberFormatException e) { 
    return 42; 
    } 
} 

kesin kullanım durumuna göre değişir.

x, final numaralı telefondan uygun bir şekilde kapsamlı bir yerel değişken olduğu sürece, en pratik genel yaklaşım, final numaralı ürünü bırakmak olabilir. Öte yandan, x üye değişkeni ise

, benim tavsiyem başlatma sırasında bir sivil final geçici kullanmak olacaktır:

public class C { 
    private final int x; 
    public C() { 
    int x_val; 
    try { 
     x_val = Integer.parseInt("someinput"); 
    } 
    catch(NumberFormatException e) { 
     x_val = 42; 
    } 
    this.x = x_val; 
    } 
} 
+0

Yerel bir kapsam için sizinle aynı fikirdeyim, ancak bu çoğunlukla örnek değişkenler ile ortaya çıkar. – dtech

+0

Bir hata yansıtıcı statik yöntem getValue() statik bir başvuru yapamaz sanırım, bu yüzden statik işlevini kullanmak varsayalım, yanlış özel statik int getValue() olabilir .. @ NPE – gks

+0

this.x, tamsayı gibi bir nesne tipidir, o zaman biraz daha fazlasına ihtiyacınız vardır (ne yazık ki). X_val bildirilmemişse, derleyici başlatılmamış olabileceğinden şikayet eder. Yakalama bloğu için geri dönüşün boş olması durumunda, null olarak baştan başlatmanız gerekir ve ya berraklık için boşluğa boş değer atamanız gerekir (bu benim tercihimdir) ya da boş bir yakalama olsun. –

2

Hayır doğru yer değil, elinde hayal daha o zaman, 1 deneme ve catch bloğunuzdaki deyim, birincisi: x = 42. Diğer bazı ifadelerden sonra, try bloğu başarısız olur ve x = 30'unuzu söyleyen catch bloğuna gider. Şimdi x'i iki kere tanımladınız.

+9

Derleyici hangi ifadelerin hangi özel durumları attığını bilecek kadar akıllıdır. Her durumda mümkün olmayabilir, fakat derleyicinin bazı durumlarda ölü kodlar vb. Hakkında size söyleyebileceği gibi, finalin işe yarayıp yaramayacağını anlayabilmelidir. – Stefan

+0

@Stefan'ın söylediklerini desteklemek için, Swift'i derlerken Clang bunu çözebilir. –

İlgili konular