JavaRush /Java блогу /Random-KY /Кайтаруу билдирүүсү Java
Viacheslav
Деңгээл

Кайтаруу билдирүүсү Java

Группада жарыяланган

Киришүү

Белгилүү болгондой, Java an objectиге багытталган программалоо тor болуп саналат. Башкача айтканда, негизги түшүнүк, анткени негиздеринин негизи бардыгы an object болуп саналат деп айтууга болот. Объекттер класстар аркылуу сүрөттөлөт. Java тorнде кайтаруу билдирүүсү - 1Класстар, өз кезегинде, абалы жана жүрүм-туруму бар. Мисалы, банк эсеби эсептеги акчанын суммасы түрүндөгү абалга ээ жана балансты көбөйтүү жана азайтуу жүрүм-турумуна ээ болушу мүмкүн. Javaдагы жүрүм-турум методдор аркылуу ишке ашырылат. Методдорду кантип сүрөттөш керек, Java үйрөнүү саякатыңыздын эң башында киргизилет. Мисалы, Oracle компаниясынын расмий окуу куралында: “ Методдорду аныктоо ”. Бул жерде эки маанилүү аспект бар:
  • Ар бир ыкманын кол тамгасы бар. Кол коюу методдун аталышынан жана анын киргизүү параметрлеринен турат;
  • Методдор кайтаруу түрүн көрсөтүшү керек;
  • Кайтаруу түрү ыкма колунун бир бөлүгү эмес.
Дагы бир жолу, бул Java катуу терилген тил экендигинин кесепети жана компилятор кайсы типтер мүмкүн болушунча кайда колдонуларын алдын ала түшүнгүсү келет. Дагы бир жолу, бизди каталардан коргоо үчүн. Жалпысынан алганда, баары жакшылык үчүн. Бул дагы бир жолу бизге маалыматтар менен иштөө маданиятын үйрөтөт, менимче. Ошентип, ыкмалар үчүн маанинин түрү көрсөтүлөт. Жана ушул эле маанини ыкмалардан кайтаруу үчүн, ачкыч сөз колдонулат return.

Java тorндеги ачкыч сөздү кайтаруу билдирүүсү

Билдирүүнүн ачкыч сөзү oracle окуу куралында талкуулангандай " контролдук агым билдирүүлөрүнөreturn " тиешелүү . Ошондой эле баалуулуктарды кантип кайтаруу керектиги жөнүндө расмий окуу куралынан окуй аласыз: “ Методдон маанини кайтаруу ”. Компилятор методдон кайтарылган маани метод тарабынан көрсөтүлгөн кайтаруу маани түрүнө дал келишин кылдаттык менен көзөмөлдөйт. Мисал катары tutorialspoint'тен Online IDE колдонолу. Келгиле, баштапкы мисалды карап көрөлү:
public class HelloWorld {
    public static void main(String []args) {
        System.out.println("Hello World");
    }
}
Көрүнүп тургандай, бул жерде ыкма аткарылат main, ал программага кирүү чекити болуп саналат. Коддун саптары жогорудан ылдыйга чейин аткарылат. Биздин mainыкма баалуулуктарды кайтара алbyte, антпесе биз ката алабыз: " Error: Main method must return a value of type void". Ошондуктан, ыкма жөн гана экранга чыгат. Келгиле, сапты кабыл алууну кабарды кабыл алуунун өзүнчө ыкмасына жылдыралы:
public class HelloWorld {

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

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

}
Көрүнүп тургандай, ачкыч сөздү колдонуп, returnбиз кийинчерээк методдо колдонгон кайтаруу маанисин көрсөттүк println. Методдун сыпаттамасында (аныктамасында) getHelloMessageбиз ал бизге кайтарып берерин көрсөттүк String. Бул компиляторго методдун аракеттери жарыяланган ыкмага шайкеш келээрин текшерүүгө мүмкүндүк берет. Албетте, методдун аныктамасында көрсөтүлгөн кайтаруу маанисинин түрү codeдон кайтарылган маанинин түрүнөн кененирээк болушу мүмкүн, б.а. Негизгиси, түрлөрү бири-бирине кыскарган. Болбосо биз компиляция убактысынын катасын алабыз: " error: incompatible types". Айтмакчы, суроо дароо туулат: Эмне үчүн returnал программанын агымын башкаруу операторлоруна тиешелүү? Бирок, анткени бул программанын нормалдуу агымын жогорудан ылдыйга чейин үзгүлтүккө учуратышы мүмкүн. Мисалы:
public class HelloWorld {

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

}
Мисалдан көрүнүп тургандай, mainбиздин java программабыз параметрсиз чакырылса, методдун аткарылышын үзгүлтүккө учуратабыз. returnЭгер сизде code болсо, ал жеткorксиз болуп каларын эстен чыгарбоо керек . Жана биздин акылдуу компилятор муну байкап, мындай программаны иштетүүгө жол бербейт. Мисалы, бул code түзүлбөйт:
public static void main(String []args) {
        System.out.println("1");
        return;
        System.out.println("2");
 }
Муну айланып өтүү үчүн ыплас хакер бар. Мисалы, мүчүлүштүктөрдү оңдоо максатында же башка себептерден улам. returnЖогорудагы codeду блокко ороп оңдоого болот if:
if (2==2)  {
    return;
}

Ката иштетүүдө билдирүүнү кайтаруу

Бир өтө татаал жагдай бар - биз аны returnкаталарды чечүү менен бирге колдонсок болот. Мен дароо айткым келет, аны блокто колдонуу returnабдан catch, абдан жаман форма, андыктан андан качышыңыз керек. Бирок бизге мисал керек, туурабы? Мына ал:
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);
        }
    }

}
Бир караганда, 2 кайтарылышы керек окшойт, анткени finallyал дайыма аткарылат. Бирок жок, маани 1 болот жана өзгөрмөнүн өзгөрүүсү finallyэтибарга алынbyte. Андан тышкары, эгерде ал valuean objectти камтыса жана биз finallyдесек value = null, анда ал catchдагы эле an objectке шилтемени кайтарып бермек эмес, null. Бирок блоктон finallyоператор returnтуура иштемек. Мындай белек үчүн кесиптештер сизге ыраазычылык билдирбейт.
Дагы эмнени окуу керек:

кайтаруу билдирүүсү

void.class

Анан акыры. сыяктуу кызыктай курулуш жазсаңыз болот void.class. Көрсө, эмне үчүн жана мааниси эмнеде? Чынында, Java Reflection API колдонулган ар кандай алHowтарда жана татаал учурларда , бул абдан зарыл болушу мүмкүн. Мисалы, сиз ыкманын кандай түрүн кайтарып берерин текшере аласыз:
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);
        }
    }
}
Бул методдордун чыныгы codeун алмаштыруу зарыл болгон сыноо алHowтарында пайдалуу болушу мүмкүн. Бирок бул үчүн, бул ыкма өзүн кандай түшүнүшү керек (б.а., ал кандай түрлөрүн кайтарат). mainЖогорудагы codeдон ыкманы ишке ашыруунун экинчи жолу бар :
public static void main (String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
Алардын ортосундагы айырманы бир топ кызыктуу талкуулоону stackoverflow боюнча окууга болот: java.lang.Void менен void ортосунда кандай айырма бар? #Вячеслав
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION