Som vi vet Àr Java-sprÄket ett objektorienterat programmeringssprÄk. Med andra ord Àr det grundlÀggande konceptet, dvs grunden till grunden, att allt Àr ett objekt. Objekt beskrivs med hjÀlp av klasser. Klasser definierar i sin tur tillstÄnd och beteende. Till exempel kan ett bankkonto ha tillstÄnd i form av summan pengar pÄ kontot och ha beteenden som ökar och minskar kontosaldot. I Java implementeras beteenden genom metoder. Att lÀra sig att definiera metoder kommer i början av dina Java-studier. Till exempel i Oracles officiella handledning, under rubriken " Definiera metoder ". Det finns tvÄ viktiga saker att notera hÀr:
  • Varje metod har en signatur. Signaturen bestĂ„r av namnet pĂ„ metoden och dess inmatningsparametrar.
  • En returtyp mĂ„ste anges för metoder. Du deklarerar en metods returtyp i dess metoddeklaration.
Returtypen Ă€r inte en del av metodsignaturen. Återigen Ă€r detta en konsekvens av att Java Ă€r ett starkt typat sprĂ„k och kompilatorn vill veta vilka typer som anvĂ€nds och var, i förvĂ€g och sĂ„ mycket som möjligt. Återigen, detta Ă€r för att rĂ€dda oss frĂ„n misstag. I grund och botten Ă€r allt för en god sak. Och det förefaller mig som att detta Ă„terigen ingjuter i oss en kultur att hantera data. SĂ„ typen av returvĂ€rde anges för metoder. Och nyckelordet retur i Java anvĂ€nds för att faktiskt göra returen. Java retur nyckelord - 1

Vad gör retur i Java

Nyckelordet retur Àr en kontrollflödessats, som beskrivs i Oracle-handledningen hÀr . Du kan ocksÄ lÀsa om hur du returnerar vÀrden i avsnittet " Returnera ett vÀrde frÄn en metod " i den officiella handledningen. Kompilatorn hÄller noga reda pÄ om den kan sÀkerstÀlla att en metods returvÀrde matchar metodens angivna returtyp. LÄt oss anvÀnda Tutorialspoints online-IDE för att övervÀga ett exempel. LÄt oss titta pÄ det ursprungliga exemplet:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
Som vi kan se exekveras huvudmetoden hĂ€r, vilket Ă€r programmets ingĂ„ngspunkt. Kodrader exekveras uppifrĂ„n och ned. VĂ„r huvudmetod kan inte returnera ett vĂ€rde. Om vi ​​försöker returnera ett vĂ€rde dĂ€r fĂ„r vi ett felmeddelande: "Error: Main method must return a value of void" . Följaktligen matas metoden helt enkelt ut till skĂ€rmen. LĂ„t oss nu flytta strĂ€ngen bokstavligt till en separat metod för att generera meddelandet:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println(getHelloMessage());
    }
    
    public static String getHelloMessage() {
        return "Hello World";
    }
    
}
Som vi kan se anvÀnde vi nyckelordet return för att indikera returvÀrdet, som vi sedan skickade till println -metoden. Deklarationen av metoden getHelloMessage indikerar att metoden kommer att returnera en strÀng . Detta gör att kompilatorn kan kontrollera att metodens ÄtgÀrder stÀmmer överens med hur den deklareras. Naturligtvis kan returtypen som anges i en metoddeklaration vara bredare Àn typen av det vÀrde som faktiskt returneras i koden, dvs det viktiga Àr att en typkonvertering Àr möjlig. Annars kommer vi att fÄ ett felmeddelande vid kompilering: "Fel: inkompatibla typer" . Förresten, du har förmodligen en frÄga: Varför Àr returanses vara en kontrollflödesbeskrivning? Eftersom det kan störa ett programs normala uppifrÄn-och-ned-flöde. Exempel:

public class HelloWorld {

    public static void main(String[] args) {
        if (args.length == 0) {
            return;
        }
        for (String arg : args) {
            System.out.println(arg);
        }
    }
    
}
Som du kan se i exemplet avbryter vi huvudmetoden i Java-programmet om den anropas utan argument. Det Àr viktigt att komma ihÄg att om du har kod efter ett returutdrag sÄ kommer den inte att vara tillgÀnglig. VÄr smarta kompilator kommer att mÀrka det och hindra dig frÄn att köra ett sÄdant program. Till exempel kompilerar den hÀr koden inte:

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");
 }
Det finns ett smutsigt hack för att komma runt detta. Till exempel i felsökningssyfte eller av nÄgon annan anledning. Koden ovan kan fixas genom att linda retursatsen i ett if- block:

if (2==2) {
    return;
}

Returnera uttalande under felhantering

Det finns nĂ„got annat mycket knepigt — vi kan anvĂ€nda retur i samband med felhantering. Jag vill genast sĂ€ga att det Ă€r vĂ€ldigt, vĂ€ldigt dĂ„ligt att anvĂ€nda en retursats i ett catch-block, sĂ„ du bör undvika det . Men vi behöver ett exempel, eller hur? HĂ€r Ă€r det:

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);
        }
    }
    
}
Vid första anblicken verkar det som att 2 bör returneras, eftersom slutligen alltid körs. Men nej, returvÀrdet kommer att vara 1, och Àndringen av variabeln i finally -blocket kommer att ignoreras. Anta dessutom att vÀrdet innehÄller ett objekt och vi sÀger vÀrde = null i finalblocket . DÄ skulle det objektet, inte null, returneras i fÄngstblocket . Men ett returmeddelande skulle fungera korrekt i finalblocket . Uppenbarligen kommer dina medarbetare inte att tacka dig för smÄ överraskningar med returutlÄtanden.

void.class

Och slutligen. Det finns den hÀr konstiga konstruktionen du kan skriva: void.class . Hmm. Varför och vad betyder det? Det finns verkligen olika ramverk och knepiga fall som involverar Java Reflection API dÀr detta kan vara mycket anvÀndbart. Du kan till exempel kontrollera vilken typ en metod returnerar:

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);
        }
    }
}
Detta kan vara anvÀndbart i testramverk dÀr du behöver ersÀtta den faktiska koden i metoder. Men för att göra detta mÄste du förstÄ hur en metod beter sig (dvs vilken typ den returnerar). Det finns ocksÄ ett andra sÀtt att implementera huvudmetoden i koden ovan:

public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
Du kan lÀsa en ganska intressant diskussion om skillnaden mellan de tvÄ pÄ Stack Overflow: Vad Àr skillnaden mellan java.lang.Void och void?