2013-08-19 18 views
7
class For1 
{ 
    public static void main(String args[]) 
    { 
    int a = 0; 
    for(;;) 
    { 
     break; 
     System.out.println(a); //Line 1 
     ++a;//Line 2 
    } 
    } 
} 

Wiem, że linia 1/linia 2 nigdy nie zostaną wykonane. Ale nadal nie rozumiem, dlaczego został zgłoszony błąd kompilacji. Otrzymuję komunikat o błędzie "nieosiągalny komunikat".Nieosiągalny komunikat kompilacji instrukcji w Javie

Czy to oznacza, że ​​kompilator sprawdza, czy jest w stanie skompilować wszystkie gałęzie/linie kodu?

+0

Spójrz: http://stackoverflow.com/questions/3795585/why-does-java-have-an- nieosiągalny komunikat-kompilator-błąd – BobTheBuilder

Odpowiedz

5

Kompilator może również wyciągnąć taki wniosek i zakłada, że ​​popełniłeś błąd. I tak, kompilator Java wykonuje całkiem niezłą ilość "analizy przepływu danych". Najczęstszym pokrewnym komunikatem jest komunikat o zmiennych nie zainicjowanych. Druga najczęstsza jest, jak sądzę, właśnie ta, o kodzie nieosiągalnym.

12

Czy to oznacza, że ​​kompilator sprawdza, czy jest w stanie skompilować wszystkie gałęzie/linie kodu?

Oznacza to, że kompilator sprawdza, czy wszystkie wyciągi są osiągalne.

Od section 14.21 of the JLS:

Jest to błąd kompilacji, jeśli oświadczenie nie może być wykonany, ponieważ jest nieosiągalny.

Ta sekcja poświęcona jest dokładnemu wyjaśnieniu słowa "osiągalne". Chodzi o to, że musi istnieć jakaś ścieżka wykonywania od początku konstruktora, metody, inicjalizatora instancji lub inicjalizatora statycznego, który zawiera instrukcję do samej instrukcji. Analiza uwzględnia strukturę oświadczeń.

Sekcja następnie dokumentuje, w jaki sposób definiuje się osiągalność.

W szczególności, odpowiednie punkty w twoim przypadku to:

Każdy inny rachunek S w niepustym bloku, który nie jest blok przełącznik jest osiągalny IFF oświadczenie poprzedzające S może zakończyć się normalnie.

A, continue, return lub oświadczenie nie może zakończyć się normalnie.

Więc „Linia 1” oświadczenie jest poprzedzona oświadczeniem (break;), które nie mogąkompletny normalnie, a zatem jest to nieosiągalne.

0

Kompilator sprawdzi, czy po słowach kluczowych występuje więcej kodu. Innym słowem kluczowym, które spowoduje podobny komunikat, jest zastąpienie break przez return.

3

Czy to oznacza, że ​​kompilator sprawdza, czy jest w stanie skompilować dla wszystkie gałęzie/linie kodu?

Tak kompilator kompiluje całe ciało kodu i uczynić kod bajtowy według kodu, to mądrzejszy wystarczy wykrywa unreachable code także dead code.Natychmiast break w for-loop powoduje, że nieosiągalne są inne wyciągi.

for(;;){ 
    break; 
    ... // unreachable statement 
} 


int i=1; 
if(i==1) 
    ... 
else 
    ... // dead code 
1

Kompilator jest w stanie określić, że te dwa oświadczenie będzie nigdy, przenigdy nie zostanie zrealizowane, a pomaga napisać poprawny kod odmawiając go skompilować, bo ta ma 99,9% szans na błąd, a nie świadomym możliwość dodawania instrukcji, które nigdy nie zostaną wykonane.