Soru 1:
Aşağıdaki kod bir return ifadesi olmadan neden derleniyor?
public int a()
{
while(true);
}
Bu JLS§8.4.7 kapsamındadır :
Bir yöntemin bir dönüş türüne (§8.4.5) sahip olduğu bildirilirse, yöntemin gövdesi normal şekilde tamamlanabilirse, derleme zamanı hatası oluşur (§14.1).
Başka bir deyişle, döndürme türüne sahip bir yöntem yalnızca değer döndüren bir döndürme deyimi kullanarak dönmelidir; yöntemin "vücudunun ucunu düşürmesine" izin verilmez. Bir yöntem gövdesindeki dönüş ifadeleriyle ilgili kesin kurallar için §14.17'ye bakın.
Bir yöntemin bir dönüş türüne sahip olması ve yine de herhangi bir dönüş ifadesi içermemesi mümkündür. İşte bir örnek:
class DizzyDean {
int pitch() { throw new RuntimeException("90 mph?!"); }
}
Derleyici, döngünün hiçbir zaman sonlanmayacağını bildiğinden ( true
elbette her zaman doğrudur), işlevin "normal olarak geri dönemeyeceğini" (vücudunun ucunu düşürdüğünü) bilir ve bu nedenle hayır olmaması iyidir return
.
Soru 2:
Öte yandan, aşağıdaki kod neden derleniyor,
public int a()
{
while(0 == 0);
}
Aşağıdaki gibi olmasa bile.
public int a(int b)
{
while(b == b);
}
Bu 0 == 0
durumda, derleyici döngünün asla sonlanmayacağını bilir (bu 0 == 0
her zaman doğru olacaktır). Ama gelmez için biliyorum b == b
.
Neden olmasın?
Derleyici sabit ifadeleri anlar (§15.28) . Alıntı §15.2 - İfade Biçimleri (garip bir şekilde bu cümle §15.28'de olmadığı için) :
Bazı ifadelerin derleme zamanında belirlenebilen bir değeri vardır. Bunlar sabit ifadelerdir (§15.28).
Senin içinde b == b
yer alan bir değişken olduğundan örneğin, bir sabit ifadesi değildir ve derleme zamanında belirlenecek belirtilmemiştir. Biz (eğer rağmen her zaman bu durumda gerçek olacak görebilirsiniz b
olduğu bir double
QBrute olarak, işaret , kolayca aptal olabilir Double.NaN
ki, değil ==
kendisi ), ancak JLS sabit ifadeler derleme zamanında kararlı olduklarını sadece belirtir , derleyicinin sabit olmayan ifadeleri değerlendirmeye çalışmasına izin vermez. bayou.io neden olmasa da iyi bir noktaya değindi : Derleme zamanında değişkenleri içeren ifadeleri belirlemeye çalışmak için yola çıkmaya başlarsanız, nerede duruyorsunuz? b == b
açıktır (er,NaN
değerleri), ama ne olacak a + b == b + a
? Yoksa (a + b) * 2 == a * 2 + b * 2
? Çizgiyi sabitlerde çizmek mantıklıdır.
Dolayısıyla, ifadeyi "belirlemediğinden", derleyici döngünün asla sonlanmayacağını bilmez, bu nedenle yöntemin normal olarak geri dönebileceğini düşünür - ki buna izin verilmez, çünkü kullanılması gerekir return
. Yani bir eksikliği hakkında şikayet ediyor return
.