CodeGym /Java Blogu /Rastgele /Java dönüş Anahtar Kelimesi
John Squirrels
Seviye
San Francisco

Java dönüş Anahtar Kelimesi

grupta yayınlandı
Bildiğimiz gibi Java dili nesne yönelimli bir programlama dilidir. Yani temel kavram, yani temelin temeli, her şeyin bir nesne olduğudur. Nesneler, sınıflar kullanılarak tanımlanır. Sınıflar da durumu ve davranışı tanımlar. Örneğin bir banka hesabı, hesapta bulunan para miktarı şeklinde devlete sahip olabilir ve hesap bakiyesini arttırıcı ve azaltıcı davranışlar sergileyebilir. Java'da davranışlar yöntemler aracılığıyla uygulanır. Yöntemlerin nasıl tanımlanacağını öğrenmek, Java çalışmalarınızın en başında gelir. Örneğin, Oracle'ın resmi öğreticisinde, " Yöntemleri Tanımlama " başlığı altında. Burada dikkat edilmesi gereken iki önemli husus vardır:
  • Her yöntemin bir imzası vardır. İmza, yöntemin adından ve giriş parametrelerinden oluşur.
  • Yöntemler için bir dönüş türü belirtilmelidir. Bir yöntemin dönüş türünü, yöntem bildiriminde bildirirsiniz.
Dönüş türü, yöntem imzasının bir parçası değildir. Yine, bu, Java'nın kesin olarak yazılmış bir dil olmasının ve derleyicinin hangi türlerin nerede kullanıldığını önceden ve mümkün olduğunca bilmek istemesinin bir sonucudur. Yine, bu bizi hatalardan kurtarmak içindir. Temel olarak, hepsi iyi bir amaç için. Ve bana öyle geliyor ki bu bize bir kez daha veri işleme kültürünü aşılıyor. Böylece metotlar için dönüş değerinin tipi belirtilir. Ve Java'daki dönüş anahtar sözcüğü, aslında geri dönüşü yapmak için kullanılır.Java dönüş Anahtar Kelimesi - 1

Java'da dönüş ne yapar?

Geri dönüş anahtar sözcüğü , burada Oracle öğreticisinde açıklandığı gibi bir kontrol akışı ifadesidir . Resmi eğitimin " Bir Yöntemden Değer Döndürme " bölümünde değerlerin nasıl döndürüleceğini de okuyabilirsiniz . Derleyici, bir yöntemin dönüş değerinin, yöntemin belirtilen dönüş türüyle eşleşmesini sağlayıp sağlayamayacağını dikkatle izler. Bir örnek olarak Tutorialspoint'in Çevrimiçi IDE'sini kullanalım . İlkel örneğe bakalım:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
Gördüğümüz gibi, programın giriş noktası olan ana yöntem burada yürütülür. Kod satırları yukarıdan aşağıya doğru yürütülür. Ana yöntemimiz bir değer döndüremez. Orada bir değer döndürmeye çalışırsak, bir hata alırız: "Hata: Ana yöntem, geçersiz türde bir değer döndürmeli" . Buna göre, yöntem basitçe ekrana çıktı verir. Şimdi, iletiyi oluşturmak için hazır bilgi dizesini ayrı bir yönteme taşıyalım:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println(getHelloMessage());
    }
    
    public static String getHelloMessage() {
        return "Hello World";
    }
    
}
Gördüğümüz gibi, daha sonra println yöntemine ilettiğimiz dönüş değerini belirtmek için return anahtar sözcüğünü kullandık . getHelloMessage yönteminin bildirimi, yöntemin bir String döndüreceğini belirtir . Bu, derleyicinin, yöntemin eylemlerinin bildirilme biçimiyle tutarlı olup olmadığını kontrol etmesine olanak tanır. Doğal olarak, bir yöntem bildiriminde belirtilen dönüş türü, kodda gerçekte döndürülen değerin türünden daha geniş olabilir, yani önemli olan, bir tür dönüştürmenin mümkün olmasıdır. Aksi takdirde, derleme zamanında bir hata alırız: "Hata: uyumsuz türler" . Bu arada, muhtemelen bir sorunuz var: Neden iadebir kontrol akışı bildirimi olarak mı değerlendiriliyor? Çünkü bir programın yukarıdan aşağıya normal akışını bozabilir. Örnek:

public class HelloWorld {

    public static void main(String[] args) {
        if (args.length == 0) {
            return;
        }
        for (String arg : args) {
            System.out.println(arg);
        }
    }
    
}
Örnekten de görebileceğiniz gibi Java programında main method argümansız çağrılmışsa onu kesiyoruz. Bir dönüş ifadesinden sonra kodunuz varsa , buna erişilemeyeceğini unutmamak önemlidir. Akıllı derleyicimiz bunu fark edecek ve böyle bir programı çalıştırmanızı engelleyecektir. Örneğin, bu kod derlenmez:

public static void main(String[] args) {
        System.out.println("1");
        return;
// we use output method after return statement, which is incorrect 
        System.out.println("2");
 }
Bunu aşmak için kirli bir hack var. Örneğin, hata ayıklama amacıyla veya başka bir nedenle. Yukarıdaki kod, return ifadesini bir if bloğuna sararak düzeltilebilir :

if (2==2) {
    return;
}

Hata işleme sırasında dönüş ifadesi

Çok zorlayıcı bir şey daha var — dönüşü hata işleme ile birlikte kullanabiliriz . Bir catch bloğunda return deyimi kullanmanın çok ama çok kötü bir biçim olduğunu hemen söylemek istiyorum , bu yüzden bundan kaçınmalısınız. Ama bir örneğe ihtiyacımız var, değil mi? İşte burada:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Value: " + getIntValue());
    }
    
    public static int getIntValue() {
        int value = 1;
        try {
            System.out.println("Something terrible happens");
            throw new Exception();
        } catch (Exception e) {
            System.out.println("Cached value: " + value);
            return value;
        } finally {
            value++;
            System.out.println("New value: " + value);
        }
    }
    
}
İlk bakışta, 2'nin döndürülmesi gerekiyormuş gibi görünüyor, çünkü finally her zaman yürütülür. Ama hayır, dönüş değeri 1 olacak ve finally bloğundaki değişken değişikliği dikkate alınmayacaktır. Ayrıca, value'nin bir nesne içerdiğini varsayalım ve finally bloğunda value = null diyoruz . Ardından, null olmayan bu nesne, catch bloğunda döndürülür . Ancak bir dönüş ifadesi, finally bloğunda doğru şekilde çalışır . Açıkçası, iş arkadaşlarınız iade beyanları içeren küçük sürprizler için size teşekkür etmeyecektir.

geçersiz sınıf

Ve sonunda. Yazabileceğiniz şu garip yapı var: void.class . Hmm. Neden ve ne anlama geliyor? Bunun çok yararlı olabileceği Java Reflection API'yi içeren gerçekten çeşitli çerçeveler ve zor durumlar var . Örneğin, bir yöntemin hangi türü döndürdüğünü kontrol edebilirsiniz:

import java.lang.reflect.Method;

public class HelloWorld {

    public void getVoidValue() {
    }

    public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == void.class);
        }
    }
}
Bu, yöntemlerdeki gerçek kodu değiştirmeniz gereken test çerçevelerinde yararlı olabilir. Ancak bunu yapmak için, bir yöntemin nasıl davrandığını (yani, hangi türü döndürdüğünü) anlamanız gerekir. Yukarıdaki kodda ana yöntemi uygulamanın ikinci bir yolu da vardır :

public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
Stack Overflow'ta ikisi arasındaki farkla ilgili oldukça ilginç bir tartışmayı okuyabilirsiniz: java.lang.Void ve void arasındaki fark nedir?
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION