Soru “Try” bloğunda veya “catch” bloğundan sonra yöntemden dönün mü?


Aşağıdaki iki yöntem arasında bir fark var mı?

Hangisi tercih edilir ve neden?

Prg1:

public static boolean test() throws Exception {
    try {
        doSomething();
        return true;
    } catch (Exception e) {
        throw new Exception("No!");
    }    
}

Prg2:

public static boolean test() throws Exception {
    try {
        doSomething();
    } catch (Exception e) {
        throw new Exception("No!");
    }
    return true;    
}

21
2018-05-01 10:24


Menşei


İkinci snippet'i daha iyi seviyorum çünkü onu daha temiz (ve daha net) buluyorum. Performans bilge bir fark yarattığını sanmıyorum. - Eran
İlkini daha iyi severim, çünkü istisnai olarak, onu yeniden fırlatmak yerine yerel olarak ele almaya karar verirseniz ne olur. - njzk2


Cevaplar:


Sürekli bir ifadeyi döndürmediğiniz bu durumları düşünün:

Dava 1:

public static Val test() throws Exception {
    try {
        return doSomething();
    } catch (Exception e) {
        throw new Exception("No!");
    }
    // Unreachable code goes here
}

2. Durum:

public static Val test() throws Exception {
    Val toReturn = null;
    try {             
        toReturn = doSomething();
    } catch (Exception e) {
        throw new Exception("No!");
    }
    return toReturn;
}

İlkini tercih ederim. İkincisi daha ayrıntılı ve hata ayıklama olduğunda biraz karışıklığa neden olabilir.

Eğer test() yanlış iade nullve görüyorsun toReturn başlatılıyor null, sorunun içinde olduğunu düşünebilirsiniz test() (özellikle ne zaman test() bu gibi basit bir örnek değildir.

Sadece geri dönebilse de null Eğer doSomething döner null. Ancak bu bir bakışta görmek zor olabilir.


Daha sonra, tutarlılık uğruna, bunun daha iyi olduğunu tartışabilirsiniz. her zaman İlk formu kullan.


24
2018-05-01 11:08





Hayır, her iki yöntem arasında da bir fark yoktur. Programın akışını bir an ve istisna olarak ele alındığında, her iki durumda da gerçek değeri etkili bir şekilde döndürecektir. Yakalama sadece bir istisna oluştuğunda erişilecek.


4
2018-05-01 10:37





İşlevsel bir fark yoktur. Her iki program da aynı şekilde davranır. Bu sadece bir kodlama stili ve kişisel zevk meselesi.

İyi bir uygulama olarak, yöntem başına tek bir dönüş beyanı olması daha iyidir. Uzun kod kodları söz konusu olduğunda, bu tarz, (orijinal yazar veya bir başkasının) kodda değişiklik yapması gerektiğinde, kodu daha okunabilir ve gelecekte daha fazla kullanılabilir hale getirir.

Bu nedenle, ilk uygulama iyi bir uygulama açısından daha iyi kabul edilir.


3
2018-05-01 10:43



Artık bu eski bilgeliği geri çevirmeyi bırakabiliriz. Bu artık alakalı stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement - Esben Skov Pedersen


Bunun genel bir soru olduğunu farz ediyorum. Aksi takdirde, yöntem (ler) inizin diğer yönlerini yorumlayabilirim.

Bence böyle bir durumda ya da bu gibi küçük yöntemler gerçekten önemli değil. Yöntem, neler olup bittiğini anında anlayabilecek kadar kısa, neyle ilgili ne ile ilgili.

Bununla birlikte, daha uzun yöntemlerde, ilk örnekte akışın takip edilmesi daha kolaydır. Benim fikrimce. İlgili kodu ve ilgili senaryoları bir arada tutar. Yöntemi okuduğunuzda, normal yürütme akışı catch Blok, daha açık ve "akıcı" hale getiriyor.

public static boolean test() throws Exception {
    try {
        doSomething();
        return true;
    } catch (Exception e) {
        throw new Exception("No!");
    }    
}

Ama bunu tüm yöntemler için genelleştirmeyeceğim; her şey bağlam hakkında.


2
2018-05-01 22:31





Bir fark yoktur, ancak ilk Prg1 Prg2'den daha hızlıdır.


-5
2018-05-01 10:40



Bunun bir kanıtı var mı? - Po-ta-toe
Bu kodu kullanarak kanıtlayabilirsiniz: uzun startTime, endTime, duration; startTime = System.nanoTime (); dnm2 (); // veya test1 () endTime = System.nanoTime (); - ABBOne
Bu, bir uygulamayı kıyaslamanın iyi bir yolu değildir - Po-ta-toe
Kodunuzla satır içi metrikler ekleyerek kodunuzun ne yaptığını gerçekten etkilersiniz. Programınız artık gerekmemesi gereken adımları yürütmek zorunda. Bu, derleyicinin IL'yi oluşturma şeklini değiştirebilir - Po-ta-toe
Görmek stackoverflow.com/q/504103/3004881 - Dan Getz