2011-03-08 22 views
7

Do celów testowych często zaczynam wpisywać kod w już istniejącym projekcie. Tak, mój kod Chcę przetestować jest przed wszystkim innym kodem, tak:Kompilator Java: Przestań narzekać na martwy kod

public static void main(String[] args) 
{ 
    char a = '%'; 
    System.out.println((int)a); 
    // To know where '%' is located in the ASCII table. 

    // But, of course, I don't want to start the whole project, so: 
    return; 

    // The real project starts here... 
} 

Ale kompilator narzeka na return -statement, z powodu następującego kodu „martwego”. (Choć w C++ kompilator przestrzega programatora i po prostu kompiluje return)

Aby zapobiec kompilator narzeka, piszę głupie if -statement:

if (0 != 1) return; 

nienawidzę go. Dlaczego kompilator nie może zrobić tego, o co pytam? Czy są jakieś flagi kompilacyjne lub adnotacje, czy jakikolwiek inny element do rozwiązania mojego problemu?

Dzięki

+3

Zalecam, aby testy były przeprowadzane na zewnątrz budynku. Testy Junit mogą być rozwiązaniem. – reef

+1

@ freef Myślę, że ma na myśli "eksperymentowanie", a nie testowanie jednostkowe. – Rup

+0

Java ma inną filozofię projektowania niż C. C pozwala ci na wszystko, co nie jest zabronione i nie powstrzymuje cię przed popełnianiem błędów (zakłada, że ​​to twój problem). Java próbuje uniemożliwić ci robienie rzeczy, które nie mają sensu i będzie krzyczeć, jeśli wie, że jakiś kod nie zostanie wykonany. Podoba się lub nie, ale tak właśnie jest. –

Odpowiedz

10

Brak flag do zmiany tego zachowania. Reguły, które powodują, że martwy kod jest błędem czasu kompilacji, to part of the JLS (§14.21 Unreachable Statements) i nie można go wyłączyć.

Istnieje wyraźna luka w pętli, która pozwala kod tak:

if (true) return; 

someOtherCode(); // this code will never execute, but the compiler will still allow it 

Odbywa się to wyraźnie, aby umożliwić „komentowanie-out” lub kompilacja warunkowa (w zależności od jakiegoś static final boolean flagą).

W przypadku jesteś ciekawy: luka opiera się na fakcie, że wiadomo, stała wartość wyrażenia stan wykonania instrukcji if jest nie rozważyć podczas sprawdzania osiągalność kodu wewnątrz lub po oświadczeniu if. Podobna sytuacja występuje w przypadku while, gdzie znane stałego wartości badanym, więc ten kod nie zostanie skompilowany:

while (true) return; 

someOtherCode(); // this will be flagged as an unreachable statement 
+0

idealna odpowiedź. –

1

Nie powinno mieć dużo martwych dorsza ein swój projekt jednak dwa sposoby, ja to obejść do prototypowania.

Użyj/* * /, aby skomentować kod.

// But, of course, I don't want to start the whole project, so: 
    /* 
    // The real project starts here... 


    */ 
} 

lub utwórz drugą metodę.

// But, of course, I don't want to start the whole project, so: 
    // realProject(); 
} 

public static void realProject() 
    // The real project starts here... 
} 
+1

Nie sugerowałbym używania '/ * * /' do komentowania "martwego" kodu: prowadzi to do kodu, który jest niewidoczny dla IDE: nie znaleziono go podczas "odnajdywania referencji", nie wpływa na niego refaktoryzacja , nie dostaniesz podświetlania składni i tak dalej. Znalazłem zawijanie "martwego" kodu z 'if (false) {}' jest czystszym rozwiązaniem. Najlepszym rozwiązaniem na dłuższą metę jest oczywiście usunięcie całego martwego kodu i pozostawienie historii na żywo tylko w systemie kontroli wersji ;-) –

+0

Intellij jest całkiem niezły w refaktoryzacji skomentowanego kodu (to również narzeka, że ​​masz kod w swoich komentarzach;) jednak usunięcie go jest zwykle najlepszą polityką. –

+0

IDEA to robi? To zgrabne, ale brzmi też trochę krucho. Czy narzeka również na próbki kodu w JavaDoc? –