2013-03-04 15 views
8

Wyciągnąłem czyjś APK (aplikację na Androida), aby zobaczyć kod źródłowy Java i zobaczyłem wiele kodu return;, nawet na metodach void.Co zwraca; (bez wartości) oznacza?

Na przykład:

public void doSomething(){ 
do{ 
    return; //This line makes the code below unreachable and can't compile in Eclipse 
    switch(num){ 
     ... 
     default: 
      return; 
    } 
}while(...) 
... 
} 

Jak to aplikacja wydaje się dobrze działa na moim telefonie?

Domyślam się, że return; jest jak skrót do zerwania z metody. Czy to prawda?

+2

Dekompilatory nie zawsze są doskonałe. – Vulcan

+1

Każda metoda ostatecznie wraca. Tak więc metoda z typem zwrotu 'void' może albo" zwrócić; "albo ją pominąć. Nie jest to potrzebne i jest kwestią preferencji. – squiguy

+2

Prawdopodobny duplikat: http://stackoverflow.com/questions/744676/what-does-a-return-key-do-in-a-method-in-java –

Odpowiedz

3

Aby odpowiedzieć na pierwsze pytanie: zakładam, że ten kod jest dekompilowany. Zauważ, że dekompilatory nie są jeden do jednego konwerterów binarnego kodu dekodera do dowolnego kodu java używanego do generowania tych plików binarnych. Często mają problemy z analizowaniem różnych struktur kontrolnych, takich jak pętle i przełączniki. Poza tym plik binarny może być zaciemniony, co oznacza, że ​​po kompilacji plik binarny jest modyfikowany w taki sposób, aby był w pełni operacyjny, ale trudniej jest go dekompilować i odwrócić (w zasadzie, aby zapobiec temu, co próbujesz tutaj zrobić :)). Mogą dodać martwy kod, taki jak zwrot, którego nie powinno tam być, pętle mangle i instrukcje zezwalające na pomylenie dekompilowanego kodu itp.

+0

Dzięki temu wyjaśnia, dlaczego wszystkie pętle 'for' i' while' wydają się mieć problem. – hrsetyono

8

Tak, zgadza się. Spójrz na dole http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html:

Oświadczenie powrót

Ostatni sprawozdania rozgałęziających jest stwierdzenie powrotu. Instrukcja return return wychodzi z bieżącej metody, a przepływ sterowania powraca do miejsca, w którym wywołano metodę. Instrukcja return ma dwie formy: : jedna zwraca wartość, a druga nie. Aby zwrócić wartość , po prostu umieść wartość (lub wyrażenie, które oblicza wartość ) po słowie kluczowym return.

return ++ count; Typ danych zwróconej wartości musi być zgodny z typem deklarowanej wartości zwracanej przez metodę. Gdy metoda zostanie zadeklarowana jako , użyj formularza zwrotu, który nie zwraca wartości.

return;

+0

Dzięki! Nigdy nie wiedziałem, że metoda 'void' może używać' return'. – hrsetyono

16

Jeśli metoda zwróci void, to return; po prostu wychodzi z metody w tej instrukcji, nie uruchamiając następujących instrukcji.

+0

czy to jest jak powracająca próżnia ??? –

+0

@HussainAkhtarWahid tak, myślę, że to nic nie zwraca – hrsetyono