CodeGym /Java blog /Tilfældig /Java return nøgleord
John Squirrels
Niveau
San Francisco

Java return nøgleord

Udgivet i gruppen
Som vi ved, er Java-sproget et objektorienteret programmeringssprog. Med andre ord er det grundlæggende begreb, altså fundamentet for fundamentet, at alt er et objekt. Objekter beskrives ved hjælp af klasser. Klasser definerer til gengæld tilstand og adfærd. For eksempel kan en bankkonto have tilstand i form af mængden af ​​penge på kontoen og have adfærd, der øger og mindsker kontosaldoen. I Java implementeres adfærd gennem metoder. At lære at definere metoder kommer helt i begyndelsen af ​​dine Java-studier. For eksempel i Oracles officielle tutorial under overskriften " Defining Methods ". Der er to vigtige ting at være opmærksom på her:
  • Hver metode har en signatur. Signaturen består af navnet på metoden og dens inputparametre.
  • Der skal angives en returtype for metoder. Du angiver en metodes returtype i dens metodeerklæring.
Returtypen er ikke en del af metodesignaturen. Igen er dette en konsekvens af, at Java er et stærkt typesprog, og compileren ønsker at vide, hvilke typer der bruges og hvor, på forhånd og så meget som muligt. Igen, dette er for at redde os fra fejltagelser. I bund og grund er det hele for en god sag. Og det forekommer mig, at dette endnu en gang indgyder os en kultur for håndtering af data. Så typen af ​​returværdi er specificeret for metoder. Og nøgleordet retur i Java bruges til rent faktisk at udføre returneringen. Java return søgeord - 1

Hvad gør returnering i Java

Returnøgleordet er en kontrolflow-sætning, som beskrevet i Oracle- vejledningen her . Du kan også læse om, hvordan du returnerer værdier i afsnittet " Returnerer en værdi fra en metode " i den officielle vejledning. Compileren holder nøje styr på, om den kan sikre, at en metodes returværdi matcher metodens angivne returtype. Lad os bruge Tutorialspoints Online IDE til at overveje et eksempel. Lad os se på det oprindelige eksempel:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
Som vi kan se, udføres hovedmetoden her, som er programmets indgangspunkt. Kodelinjer udføres fra top til bund. Vores hovedmetode kan ikke returnere en værdi. Hvis vi forsøger at returnere en værdi der, får vi en fejl: "Fejl: Hovedmetoden skal returnere en værdi af typen void" . Følgelig udsender metoden simpelthen til skærmen. Lad os nu flytte strengen bogstaveligt til en separat metode til at generere meddelelsen:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println(getHelloMessage());
    }
    
    public static String getHelloMessage() {
        return "Hello World";
    }
    
}
Som vi kan se, brugte vi return nøgleordet til at angive returværdien, som vi så videresendte til println metoden. Erklæringen af ​​getHelloMessage- metoden indikerer, at metoden vil returnere en streng . Dette giver compileren mulighed for at kontrollere, at metodens handlinger stemmer overens med, hvordan den er erklæret. Naturligvis kan returtypen angivet i en metodedeklaration være bredere end typen af ​​den værdi, der faktisk returneres i koden, dvs. det vigtige er, at en typekonvertering er mulig. Ellers får vi en fejl på kompileringstidspunktet: "Fejl: inkompatible typer" . Forresten har du sikkert et spørgsmål: Hvorfor er tilbagevendenbetragtes som en kontrolflow-erklæring? Fordi det kan forstyrre det normale top-down flow i et program. Eksempel:

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 fra eksemplet, afbryder vi hovedmetoden i Java-programmet, hvis den kaldes uden argumenter. Det er vigtigt at huske, at hvis du har kode efter en returopgørelse , vil den ikke være tilgængelig. Vores smarte compiler vil bemærke det og forhindre dig i at køre sådan et program. For eksempel kompilerer denne kode ikke:

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");
 }
Der er et beskidt hack til at komme uden om dette. For eksempel til fejlfindingsformål eller af en anden grund. Ovenstående kode kan rettes ved at pakke returerklæringen ind i en if- blok:

if (2==2) {
    return;
}

Returerklæring under fejlhåndtering

Der er noget andet meget vanskeligt - vi kan bruge retur i forbindelse med fejlhåndtering. Jeg vil med det samme sige, at det er meget, meget dårligt at bruge en returerklæring i en catch- blok, så du bør undgå det. Men vi har brug for et eksempel, ikke? Her er 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);
        }
    }
    
}
Ved første øjekast ser det ud til, at 2 skal returneres, da endelig altid udføres. Men nej, returværdien vil være 1, og ændringen til variablen i finally -blokken vil blive ignoreret. Antag desuden, at værdien indeholder et objekt, og vi siger værdi = null i den endelige blok. Så ville objektet, ikke null, blive returneret i catch- blokken. Men en returerklæring ville fungere korrekt i den endelige blok. Det er klart, at dine kollegaer ikke vil takke dig for små overraskelser, der involverer returerklæringer.

ugyldig.klasse

Og endelig. Der er denne mærkelige konstruktion, du kan skrive: void.class . Hmm. Hvorfor og hvad betyder det? Der er virkelig forskellige rammer og vanskelige sager, der involverer Java Reflection API , hvor dette kan være meget nyttigt. For eksempel kan du kontrollere, hvilken type en metode returnerer:

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);
        }
    }
}
Dette kan være nyttigt i testframeworks, hvor du skal erstatte den faktiske kode i metoder. Men for at gøre dette skal du forstå, hvordan en metode opfører sig (dvs. hvilken type den returnerer). Der er også en anden måde at implementere hovedmetoden i koden ovenfor:

public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
Du kan læse en ret interessant diskussion om forskellen mellem de to på Stack Overflow: Hvad er forskellen mellem java.lang.Void og void?
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION