CodeGym/Blog Java/Aleatoriu/Cuvânt cheie de returnare Java
John Squirrels
Nivel
San Francisco

Cuvânt cheie de returnare Java

Publicat în grup
După cum știm, limbajul Java este un limbaj de programare orientat pe obiecte. Cu alte cuvinte, conceptul fundamental, adică fundamentul fundației, este că totul este un obiect. Obiectele sunt descrise folosind clase. Clasele, la rândul lor, definesc starea și comportamentul. De exemplu, un cont bancar poate avea starea sub forma sumei de bani din cont și poate avea comportamente care cresc și scad soldul contului. În Java, comportamentele sunt implementate prin metode. Învățarea cum să definiți metodele vine chiar la începutul studiilor dumneavoastră Java. De exemplu, în tutorialul oficial Oracle, sub titlul „ Definirea metodelor ”. Există două lucruri importante de luat în considerare aici:
  • Fiecare metodă are o semnătură. Semnătura constă din numele metodei și parametrii ei de intrare.
  • Trebuie specificat un tip de returnare pentru metode. Declarați tipul de returnare al unei metode în declarația de metodă.
Tipul returnat nu face parte din semnătura metodei. Din nou, aceasta este o consecință a faptului că Java este un limbaj puternic tipizat și compilatorul dorește să știe ce tipuri sunt folosite și unde, în avans și cât mai mult posibil. Din nou, aceasta este pentru a ne salva de greșeli. Practic, totul este pentru o cauză bună. Și mi se pare că acest lucru ne insuflă încă o dată o cultură a manipulării datelor. Deci, tipul valorii returnate este specificat pentru metode. Și cuvântul cheie return în Java este folosit pentru a face efectiv returnarea. Cuvânt cheie de returnare Java - 1

Ce face return în Java

Cuvântul cheie return este o instrucțiune de flux de control, așa cum este descris în tutorialul Oracle aici . De asemenea, puteți citi despre cum să returnați valori în secțiunea „ Returnarea unei valori dintr-o metodă ” a tutorialului oficial. Compilatorul urmărește cu atenție dacă se poate asigura că valoarea returnată a unei metode se potrivește cu tipul de returnare specificat al metodei. Să folosim IDE -ul online al Tutorialspoint pentru a lua în considerare un exemplu. Să ne uităm la exemplul primordial:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
După cum putem vedea, aici se execută metoda principală , care este punctul de intrare al programului. Liniile de cod sunt executate de sus în jos. Metoda noastră principală nu poate returna o valoare. Dacă încercăm să returnăm o valoare acolo, vom primi o eroare: „Eroare: Metoda principală trebuie să returneze o valoare de tip void” . În consecință, metoda iese pur și simplu pe ecran. Acum să mutăm literalul șir într-o metodă separată pentru generarea mesajului:
public class HelloWorld {

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

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

}
După cum putem vedea, am folosit cuvântul cheie return pentru a indica valoarea returnată, pe care apoi am trecut-o la metoda println . Declarația metodei getHelloMessage indică faptul că metoda va returna un String . Acest lucru permite compilatorului să verifice dacă acțiunile metodei sunt în concordanță cu modul în care este declarată. Desigur, tipul de returnare specificat într-o declarație de metodă poate fi mai larg decât tipul valorii returnate efectiv în cod, adică important este că este posibilă o conversie de tip. În caz contrar, vom primi o eroare la momentul compilării: „Eroare: tipuri incompatibile” . Apropo, probabil că ai o întrebare: De ce este întoarcereaconsiderată o declarație de flux de control? Pentru că poate perturba fluxul normal de sus în jos al unui program. Exemplu:
public class HelloWorld {

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

}
După cum puteți vedea din exemplu, întrerupem metoda principală în programul Java dacă este apelată fără argumente. Este important să rețineți că, dacă aveți cod după o declarație return , acesta nu va fi accesibil. Compilatorul nostru inteligent va observa acest lucru și vă va împiedica să rulați un astfel de program. De exemplu, acest cod nu compilează:
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");
 }
Există un truc murdar pentru a ocoli asta. De exemplu, în scopuri de depanare sau din alt motiv. Codul de mai sus poate fi remediat prin împachetarea instrucțiunii return într-un bloc if :
if (2==2) {
    return;
}

Returnează declarația în timpul tratării erorilor

Mai este ceva foarte complicat - putem folosi return împreună cu gestionarea erorilor. Vreau să spun imediat că utilizarea unei instrucțiuni return într-un bloc catch este o formă foarte, foarte proastă, așa că ar trebui să o evitați. Dar avem nevoie de un exemplu, nu? Iată-l:
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);
        }
    }

}
La prima vedere, se pare că 2 ar trebui returnat, deoarece în cele din urmă este întotdeauna executat. Dar nu, valoarea returnată va fi 1, iar modificarea variabilei din blocul final va fi ignorată. Mai mult, să presupunem că valoarea conține un obiect și spunem valoare = nul în blocul final . Apoi acel obiect, nu nul, va fi returnat în blocul catch . Dar o instrucțiune return ar funcționa corect în blocul final . Evident, colegii tăi nu vă vor mulțumi pentru micile surprize care implică declarații de returnare.

vid.clasa

Și, în sfârșit. Există această construcție ciudată pe care o poți scrie: void.class . Hmm. De ce și ce înseamnă? Există într-adevăr diverse cadre și cazuri complicate care implică API-ul Java Reflection, unde acest lucru poate fi foarte util. De exemplu, puteți verifica ce tip returnează o metodă:
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);
        }
    }
}
Acest lucru poate fi util în cadrele de testare în care trebuie să înlocuiți codul real în metode. Dar pentru a face acest lucru, trebuie să înțelegeți cum se comportă o metodă (adică ce tip returnează). Există, de asemenea, o a doua modalitate de a implementa metoda principală din codul de mai sus:
public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
Puteți citi o discuție destul de interesantă despre diferența dintre cele două pe Stack Overflow: Care este diferența dintre java.lang.Void și void?
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu