SORU
25 HAZİRAN 2015, PERŞEMBE


Dönüş türü ile Java yöntemi return ifadesi olmadan derler

Soru 1:

Neden aşağıdaki kod return bir açıklama olmadan derlemek?

public int a() 
{
    while(true);
}

Eğer while sonra return sonra da eklersem Unreachable Code Error I. dikkat:

Soru 2:

Diğer taraftan, neden aşağıdaki kod derleme yapar

public int a() 
{
    while(0 == 0);
}

aşağıdaki olsa bile:

public int a(int b)
{
    while(b == b);
}

Düzenleme:Bu yinelenen hayır! İkinci soru bu yazı eşsiz kılıyor. Lütfen dikkatle bu yinelenen bir karar vermeden önce okuyun.

CEVAP
25 HAZİRAN 2015, PERŞEMBE


Soru 1:

Neden aşağıdaki kodu bir dönüş ifadesi olmadan derlemek?

public int a() 
{
    while(true);
}

Bu JLS§8.4.7 ile kaplıdır:

Eğer bir yöntemin dönüş türü (§8.4.5) ilan edilirse, o zaman bir derleme zamanı hata varsa yöntemi normal vücut (madde 14.1) tamamlamak oluşur.

Diğer bir deyişle, dönüş türü bir yöntem sadece değer bir getiri sağlayan bir dönüş ifadesi kullanarak geri dönmelidir; bu yöntem için izin verilmez "gövdesi sonuna bırakmak". Yöntem gövde ifadeleri dönüşü ile ilgili kesin kurallar §14.17 bakın.

Dönüş türü var ve henüz hiçbir geri dönüş komutları içeren bir yöntem olabilir. İşte bir örnek:

class DizzyDean {
    int pitch() { throw new RuntimeException("90 mph?!"); }
}

Beri derleyici bilir bu döngü asla sona (true her zaman doğru, elbette), o da biliyor işlevi olamaz "return normalde" (bırak sonunda kendi vücut), ve böylece sorun yoktur return.

Soru 2:

Diğer taraftan, neden aşağıdaki kod derleme yapar

public int a() 
{
    while(0 == 0);
}

aşağıdaki olsa bile.

public int a(int b)
{
    while(b == b);
}

0 == 0 Bu durumda, derleyici döngü asla sona erecektir 0 == 0 her zaman doğru olacak) bilir. Amayokb == b.

Neden olmasın?

Derleyici constant expressions (§15.28) anlar. §15.2 - Forms of Expressions alıntıişin garibi bu cümleyi §15.28 değil çünkü):

Bazı ifadeler derleme zamanında tespit edilebilir bir değer var. Busabit ifade(§15.28).

Bir değişken söz konusu olmadığından b == b örnekte, sabit bir ifade değil ve derleme sırasında belirlenecek belirtilen değil.Bizgörüyor musun her zaman olacak gerçek bu durumda (eğer rağmen b double, QBrute pointed out, biz-ebil kolayca kanmayın tarafından Double.NaN, not == itself), ama sadece İDEA belirten sabit ifadeleridir tespit derleme zamanında, değil izin derleyici için denemek için değerlendirmek sabit olmayan ifadeler. bayou.seni yolda ifadeleri derleme zamanında değişken içeren belirlemeye çalışırken, başla, nerde durursun? Eğer ıo raised a good point neden olmasın: b == b açık olmayanNaN değerleri için er), ancak a b == b a ne hakkında? Ya da (a b) * 2 == a * 2 b * 2? Sabitler de o kadar mantıklı.

Bu yüzden yana değil "belirlemek" ifadesi, derleyici bilmiyor bu döngü asla sona, böyle düşünüyor yöntemi dönebilirsiniz normalde-ki buna izin verilmedi, çünkü gerekli kullanın return. return bir eksikliği olduğundan şikayet ediyor.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Tahir Jahi

    Tahir Jahi

    6 Mart 2006
  • TechSmartt

    TechSmartt

    29 Aralık 2010
  • tsweeney79

    tsweeney79

    21 Ocak 2008