Bunun için Java durumunun özellikleri (muhtemelen C # durumuna çok benzer), Java derleyicisinin bir yöntemin geri dönüp dönmediğini nasıl belirlediğiyle ilgilidir.
Özellikle, kurallar, dönüş türüne sahip bir yöntemin normal olarak tamamlanmaması ve bunun yerine her zaman JLS 8.4.7 uyarınca aniden (aniden burada bir iade ifadesi veya bir istisna ile gösterilir) tamamlanması gerektiğidir .
Bir yöntemin bir dönüş türüne sahip olduğu bildirilirse, yöntemin gövdesi normal olarak tamamlanabilirse, derleme zamanı hatası oluşur. 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; "vücudunun ucunu düşürmesine" izin verilmez .
Derleyici , JLS 14.21 Ulaşılamaz Beyanlarında tanımlanan kurallara dayanarak normal sonlandırmanın mümkün olup olmadığını görmektedir. ve normal tamamlama kurallarını da tanımladığını araştırmaktadır.
Özellikle, ulaşılamayan ifadelerin kuralları, yalnızca true
sabit bir ifadesi tanımlanmış döngüler için özel bir durum oluşturur :
Bir while ifadesi, aşağıdakilerden en az biri doğru olduğunda normal şekilde tamamlanabilir:
While ifadesine ulaşılabilir ve koşul ifadesi, true değerine sahip sabit bir ifade (§15.28) değildir.
While ifadesinden çıkan ulaşılabilir bir break ifadesi vardır.
Eğer while
ifade normal şekilde tamamlanabiliyorsa , o zaman kodun erişilebilir olduğu kabul edildiğinden ve geri while
ulaşılabilir bir kesme ifadesi veya sabit true
ifadesi olmayan herhangi bir döngü normal olarak tamamlanabileceği kabul edildiğinden, aşağıdaki bir dönüş ifadesi gereklidir .
Bu kurallar sizin anlamına while
sabit gerçek ifadesi ile ve bir olmadan ifadesi break
olduğunu normalde tamamlamak için düşünülen asla ve onun altındaki tüm kod bu yüzden hiç düşünmedi ulaşılabilir olması . Yöntemin sonu döngünün altındadır ve döngünün altındaki her şeye ulaşılamadığından, yöntemin sonu da böyledir ve bu nedenle yöntem muhtemelen normal olarak tamamlanamaz (bu, karşılaştırıcının aradığı şeydir).
if
Diğer yandan ifadeler, döngülere sağlanan sabit ifadelerle ilgili özel muafiyete sahip değildir.
Karşılaştırmak:
// I have a compiler error!
public boolean testReturn()
{
final boolean condition = true;
if (condition) return true;
}
İle:
// I compile just fine!
public boolean testReturn()
{
final boolean condition = true;
while (condition)
{
return true;
}
}
Ayrımın nedeni oldukça ilginçtir ve derleyici hatalarına neden olmayan koşullu derleme bayraklarına izin verme arzusundan kaynaklanmaktadır (JLS'den):
Bir if ifadesinin aşağıdaki şekilde ele alınması beklenebilir:
Aşağıdakilerden en az biri doğruysa if-then ifadesi normal olarak tamamlanabilir:
İf-then ifadesine ulaşılabilir ve koşul ifadesi, değeri doğru olan sabit bir ifade değildir.
Then-ifadesi normal şekilde tamamlanabilir.
İf-then deyimine erişilebildiğinde ve koşul ifadesi değeri false olan sabit bir ifade olmadığında then-ifadesine ulaşılabilir.
İf-then-else deyimi normalde tamamlanırsa, then-ifadesi normal şekilde tamamlanabilirse veya else-ifadesi normal olarak tamamlanabilirse.
İf-then-else deyimine erişilebildiğinde ve koşul ifadesi değeri false olan sabit bir ifade olmadığında then-ifadesine ulaşılabilir.
İf-then-else deyimine erişilebiliyorsa ve koşul ifadesi değeri doğru olan sabit bir ifade değilse else-ifadesine ulaşılabilir.
Bu yaklaşım, diğer kontrol yapılarının tedavisi ile tutarlı olacaktır. Ancak, if ifadesinin "koşullu derleme" amaçları için rahatça kullanılmasına izin vermek için, gerçek kurallar farklıdır.
Örnek olarak, aşağıdaki ifade derleme zamanı hatasına neden olur:
while (false) { x=3; }
çünkü ifadeye x=3;
ulaşılamaz; fakat yüzeysel olarak benzer durum:
if (false) { x=3; }
derleme zamanı hatasına neden olmaz. Optimize edici bir derleyici, ifadenin x=3;
hiçbir zaman yürütülmeyeceğini anlayabilir ve bu ifadenin kodunu oluşturulan sınıf dosyasından çıkarmayı seçebilir, ancak ifadex=3;
burada belirtilen teknik anlamda "ulaşılamaz" olarak kabul edilmez.
Bu farklı tedavinin mantığı, programcıların aşağıdaki gibi "bayrak değişkenleri" tanımlamasına izin vermektir:
static final boolean DEBUG = false;
ve sonra aşağıdaki gibi bir kod yazın:
if (DEBUG) { x=3; }
Fikir, DEBUG değerini false yerine true veya true yerine false olarak değiştirmek ve sonra program metninde başka bir değişiklik yapmadan kodu doğru bir şekilde derlemek mümkün olmalıdır.
Koşullu kesme ifadesi neden bir derleyici hatasına neden oluyor?
Döngü erişilebilirlik kurallarında belirtildiği gibi, while döngüsü, ulaşılabilir bir kesme ifadesi içeriyorsa normal olarak tamamlanabilir. Bir ait erişilebilirlik kuralları yana if
ifadesinin ardından durumunu yapmayız maddede if
hiç dikkate böyle bir koşullu if
ifadedir sonra cümlesi her zaman erişilebilir kabul edilir.
Eğer break
ulaşılabilir durumdaysa, döngüden sonraki kod bir kez daha ulaşılabilir kabul edilir. Döngüden sonra ani sonlandırmayla sonuçlanan ulaşılabilir bir kod olmadığından , yöntemin normal şekilde tamamlanabileceği düşünülür ve böylece derleyici bunu bir hata olarak işaretler.