SORU
12 HAZİRAN 2013, ÇARŞAMBA


Son bir değişken atamayı deneyin son operasyon ise bile yakalamak içinde yeniden, olabilir mi?

Burada oldukça ikna oldum

final int i;
try { i = calculateIndex(); }
catch (Exception e) { i = 1; }

4* *muhtemelen zaten eğer kontrol catch bloğu ulaşırsa tahsis edilmiştir. Ancak, Java derleyici aynı fikirde değil ve iddia the final local variable i may already have been assigned.

Hala eksik olduğum bazı incelik var, ya da bu model potansiyel yeniden görevlendirmenin tanımlamak için Java Dil Belirtimi tarafından kullanılan sadece bir zayıflık mı? Benim ana endişe gibi şeyler Thread.stop(), hangi neden olabilir bir istisna olmak üzere atılan "dışarı ince hava," ama hala anlamadım nasıl olabilir atıldıktan sonra, atama, ki görünüşe göre bu son eylem içinde try blok.

İzin verilirse deyim yukarıda, benim yöntemim çok daha basit olurdu. Bu kullanma durumu sürekli istihdam birinci sınıf dil desteği, Scala gibi olduğunu unutmayınBelkimonad:

final int i = calculateIndex().getOrElse(1);

Bu kullanma durumu oldukça iyi bir motivasyon olarak o i bulunduğu özel bir durumda izin için hizmet düşünüyorumkesinlikle atanmamışiçinde-catch bloğu.

GÜNCELLEME

Sonra biraz düşündüm ben bile daha belli ki bu sadece bir zayıflık İDEA model: ilan ediyorum aksiyom "olarak sunulan örnek, i kesinlikle atanmamış zaman kontrol ulaştığı "catch block", değil çatışma ile başka bir aksiyom ya da teorem. Derleyici catch bloğu assigned önce i herhangi bir okuma izin vermez, i ya da değil, olamaz atanmış olup gerçeği gözlenmektedir.

CEVAP
12 HAZİRAN 2013, ÇARŞAMBA


Av İDEA:

Eğer son bir değişken kesinlikle (§16) hemen atama önce atanmamış sürece atanırsa, bir derleme zamanı hatası.

Bölüm 16 dedi:

V kesinlikle bir av önce aşağıdaki koşulların tutun: block ıff atanmamış

V kesinlikle deneyin bloktan sonra atanmamış.
V kesinlikle deneyin bloğu ait olan her bir return ifadesi önce atanmamış.
V şeklinde her açıklamada e deneyin bloğu ait olan e attıktan sonra kesinlikle atanmamış.
V her deneyin blok içinde oluşan deyimi iddia sonra kesinlikle atanmamış.
V kesinlikle deneyin bloğu ait olduğunu ve (ya) deneyin ifadeyi içeren her break deyimi daha önce atanmamış.
V hedef deneyin deyimi içerir devam eden her deneyin bloğu ait deyimi devam etmeden önce kesinlikle atanmamış.

Cesur benim. try blok sonra i atanmış olup olmadığı bilinmiyor.

Ayrıca bu örnekte

final int i;
try {
    i = foo();
    bar();
}
catch(Exception e) { // e might come from bar
    i = 1;
}

Kalın metinsadecedurum fiili hatalı atama önlenmesi 15* *yasadışı olmaktan. Bu, ince bir durumun "kesinlikle" özgün yazı kodu izin vermek için gereklidir. atanmamış olduğunu kanıtlamak için yeterli olur yani

Eğer spec ile bu durumu değiştirmek için revize edilmiştir

V kesinlikle eğer catch bloğu denetlenmeyen bir durum yakalarsa try bloğundan sonra atanmamış.
V kesinlikle eğer catch bloğu denetlenmeyen bir durum yakalarsa son ifade bir tür catch bloğu tarafından yakalanan bir istisna atma yeteneğine sahip daha önce atanmamış.

Sonra kodunuzu yasal olacağına inanıyorum. (Ad-hoc analiz.)

Göz ardı umuyorum ki bu bir genel amaçlı gönderdim ama merak ettim bu nasıl işlendiğini görmek için sabırsızlanıyordum. Faks numarası gerekli bir alandır teknik olarak olmaz umarımçokfazla hasar varsa 1-000-000-000 oraya girdim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • magnum33563

    magnum33563

    8 NİSAN 2011
  • NextKsa

    NextKsa

    7 EKİM 2009
  • Shantanu Sood

    Shantanu Soo

    3 Kasım 2008