JavaRush /Java blogi /Random-UZ /Java-da Qaytish bayonoti
Viacheslav
Daraja

Java-da Qaytish bayonoti

Guruhda nashr etilgan

Kirish

Ma'lumki, Java - bu ob'ektga yo'naltirilgan dasturlash tili. Ya'ni, asosiy tushuncha, chunki asoslarning asosini aytish uchun hamma narsa ob'ektdir. Ob'ektlar sinflar yordamida tavsiflanadi. Java-da qaytarish bayonoti - 1Sinflar, o'z navbatida, holat va xatti-harakatlarga ega. Misol uchun, bank hisobvarag'i hisobdagi pul miqdori ko'rinishidagi holatga ega bo'lishi va balansni oshirish va kamaytirish xatti-harakatlariga ega bo'lishi mumkin. Java-da xatti-harakatlar usullar yordamida amalga oshiriladi. Usullarni qanday tasvirlash Java o'rganish sayohatingizning boshida kiritiladi. Misol uchun, Oracle-dan rasmiy qo'llanmada: " Usullarni aniqlash ". Bu erda ikkita muhim jihat bor:
  • Har bir usulning imzosi bor. Imzo usul nomi va uning kiritish parametrlaridan iborat;
  • Usullar qaytarish turini ko'rsatishi kerak;
  • Qaytish turi usul imzosining bir qismi emas.
Shunga qaramay, bu Java juda qattiq terilgan til ekanligi va kompilyator iloji boricha qayerda ishlatilishini oldindan tushunishni xohlashining natijasidir. Yana bizni xatolardan himoya qilish uchun. Umuman olganda, hamma narsa yaxshilik uchun. Menimcha, bu bizga ma'lumotlar bilan ishlash madaniyatini yana bir bor singdiradi. Shunday qilib, usullar uchun qiymat turi ko'rsatilgan. Va usullardan xuddi shu qiymatni qaytarish uchun kalit so'z ishlatiladi return.

Java-da kalit so'zni qaytarish bayonoti

Bayonot kalit so'zi Oracle o'quv qo'llanmasida muhokama qilinganidek, " boshqaruv oqimi bayonotlarireturn " ni anglatadi . Shuningdek, siz qiymatlarni qanday qaytarish haqida rasmiy qo'llanmada o'qishingiz mumkin: " Usuldan qiymatni qaytarish ". Kompilyator usulidan qaytarilgan qiymat usul tomonidan ko'rsatilgan qaytariladigan qiymat turiga mos kelishini imkoni boricha diqqat bilan kuzatib boradi. Misol sifatida tutorialspoint dan Onlayn IDE dan foydalanamiz. Keling, asl misolni ko'rib chiqaylik:
public class HelloWorld {
    public static void main(String []args) {
        System.out.println("Hello World");
    }
}
Ko'rib turganimizdek, bu erda maindasturga kirish nuqtasi bo'lgan usul bajariladi. Kod satrlari yuqoridan pastgacha bajariladi. Bizning mainusulimiz qiymatlarni qaytara olmaydi, aks holda biz xatoga duch kelamiz: " Error: Main method must return a value of type void". Shuning uchun, usul shunchaki ekranga chiqadi. Keling, satrni qabul qilishni xabarni qabul qilishning alohida usuliga o'tkazamiz:
public class HelloWorld {

    public static void main(String []args) {
        System.out.println(getHelloMessage());
    }

    public static String getHelloMessage() {
        return "Hello World";
    }

}
Ko'rib turganimizdek, kalit so'zdan foydalanib, returnbiz keyinroq usulda qo'llagan qaytish qiymatini ko'rsatdik println. Usulning tavsifida (ta'rifida) getHelloMessagebiz u bizga qaytib kelishini ko'rsatdik String. Bu kompilyatorga usulning harakatlari e'lon qilingan usulga mos kelishini tekshirish imkonini beradi. Tabiiyki, usul ta'rifida ko'rsatilgan qaytarish qiymatining turi koddan qaytarilgan qiymat turidan kengroq bo'lishi mumkin, ya'ni. Asosiysi, turlar bir-biriga qisqartiriladi. Aks holda biz kompilyatsiya vaqti xatosini olamiz: " error: incompatible types". Aytgancha, ehtimol darhol savol tug'ildi: Nima uchun returnu dastur oqimini boshqarish operatorlariga tegishli? Lekin, chunki u yuqoridan pastgacha dasturning normal oqimini buzishi mumkin. Masalan:
public class HelloWorld {

    public static void main(String []args){
        if (args.length == 0)  {
            return;
        }
        for (String arg : args)  {
            System.out.println(arg);
        }
    }

}
Misoldan ko'rinib turibdiki, mainagar java dasturimiz parametrlarsiz chaqirilsa, usulning bajarilishini to'xtatamiz. Shuni yodda tutish kerakki, agar sizda returnkod mavjud bo'lsa, unga kirish imkoni bo'lmaydi. Va bizning aqlli kompilyatorimiz buni sezadi va bunday dasturni ishga tushirishga ruxsat bermaydi. Masalan, ushbu kod kompilyatsiya qilinmaydi:
public static void main(String []args) {
        System.out.println("1");
        return;
        System.out.println("2");
 }
Buni aylanib o'tish uchun iflos hack bor. Masalan, disk raskadrovka maqsadida yoki boshqa sabablarga ko'ra. returnYuqoridagi kodni blokga o'rash orqali tuzatish mumkin if:
if (2==2)  {
    return;
}

Xatolarni qayta ishlashda qaytarish bayonoti

Bitta juda qiyin vaziyat bor - biz uni returnxatolarni boshqarish bilan birgalikda ishlatishimiz mumkin. Darhol aytmoqchimanki, uni returnblokda ishlatish catchjuda va juda yomon shakl, shuning uchun siz undan qochishingiz kerak. Ammo bizga misol kerak, to'g'rimi? Mana u:
public class HelloWorld  {

    public static void main(String []args) {
        System.out.println("Value is: " + getIntValue());
    }

    public static int getIntValue()  {
        int value = 1;
        try {
            System.out.println("Something terrible happens");
            throw new Exception();
        } catch (Exception e) {
            System.out.println("Catched value: " + value);
            return value;
        } finally {
            value++;
            System.out.println("New value: " + value);
        }
    }

}
Bir qarashda, 2 ni qaytarish kerakdek tuyuladi, chunki finallyu har doim bajariladi. Lekin yo'q, qiymat 1 bo'ladi va o'zgaruvchining o'zgarishi finallye'tiborga olinmaydi. Bundan tashqari, agar u valueob'ektni o'z ichiga olgan bo'lsa va biz finallyaytgan bo'lsak value = null, u catchob'ektga emas, balki havolani qaytaradi null. Lekin blokdan finallyoperator returnto'g'ri ishlagan bo'lardi. Hamkasblar bunday sovg'a uchun sizga rahmat aytishmaydi.
Yana nimani o'qish kerak:

qaytarish bayonoti

bekor.sinf

Va nihoyat. kabi g'alati konstruktsiyani yozishingiz mumkin void.class. Ko'rinishidan, nima uchun va nima maqsadda? Aslida, Java Reflection API ishlatiladigan turli xil ramkalar va qiyin holatlarda bu juda zarur bo'lishi mumkin. Masalan, qanday turdagi usul qaytarilishini tekshirishingiz mumkin:
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 haqiqiy usullar kodini almashtirish zarur bo'lgan test tizimlarida foydali bo'lishi mumkin. Lekin buning uchun siz ushbu usul qanday harakat qilishini tushunishingiz kerak (ya'ni, u qanday turlarni qaytaradi). mainYuqoridagi koddan usulni amalga oshirishning ikkinchi usuli mavjud :
public static void main (String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
Ularning orasidagi farq haqida juda qiziqarli muhokamani stackoverflow-da o'qish mumkin: java.lang.Void va void o'rtasidagi farq nima? #Viacheslav
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION