Błędy w czasie kompilacji martwego kodu są określane przez kompilator, a nie przez IDE. Chociaż jest prawdą, kod nigdy nie zostanie wykonany, nie narusza żadnych zasad dotyczących nieosiągalnych instrukcji z Dokumentów Oracle.
Od Unreachable Statements
Ten rozdział poświęcony jest dokładnym wyjaśnieniem słowa „osiągalny”. 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ń. Poza specjalnym traktowaniem while, do i dla instrukcji, których warunek ma stałą wartość true, wartości wyrażeń nie są brane pod uwagę w analizie przepływu.
Zasady obowiązujące w tym przypadku zależą od tego, czy bloki, które utworzyłeś, są osiągalne. (iff = if i tylko jeśli)
Pusty blok, który nie jest blokiem przełączającym, można zakończyć normalnie, jeśli jest on osiągalny.
Niepusty blok, który nie jest blokiem przełączającym, może zakończyć się normalnie, a ostatnia instrukcja w nim może zakończyć się normalnie.
Pierwsza instrukcja w niepustym bloku, który nie jest blokiem przełączników, jest osiągalna, jeśli blok jest osiągalny.
Każda inna instrukcja S w niepustym bloku, który nie jest blokiem przełączającym, jest dostępna iff instrukcja poprzedzająca S może zakończyć się normalnie.
Sposób letsThrow
spełnia kryteria dla bloku roboczego kodu i technicznie uzupełnia normalnie. Zgłasza wyjątek, ale kończy. To, czy zgłasza wyjątek gwarantowany, nie jest brane pod uwagę przy ustalaniu, czy ten blok kodu w jego rzeczywistym użytkowaniu, , czy jest dostępny, czy nie, może zostać osiągnięty. W większości przypadków, martwy kod zostanie znaleziony tylko wtedy, gdy będzie zawierał try/catch/return, które stanowią większość reguł.
Rozważmy następujące, nawet bardziej zwięzły wersja:
@Test
public void testDeadCode() {
System.exit(0);
System.out.println("will never be reached");
}
Nie ma prawdziwego Licznik ten oprócz starannego użycia narzędzi pokrycia, ale jasne strony w przykładzie zobaczysz gwarantowane wyjątków za każdym razem uruchamiasz kod.
Wyobraź sobie tę samą sytuację, ale z dużo bardziej złożonym kodem w metodzie 'letsThrow()' z dużą ilością wewnętrznych wywołań metod. Czy prosisz kompilatora, aby również sprawdził martwy kod w tej sytuacji? Kompilator nie jest wszechmocny. – SimY4
Najlepszym sposobem na poznanie jest dokładne sprawdzenie jednostki i sprawdzenie zasięgu kodu koniczyny, która powie Ci, który kod nigdy nie jest wykonywany. – Kode
@Vwin Niezupełnie. Kod, który spowodował, że pytam wygląda na "catch (Whatever w) {tuneAndRethrow (w); rzucać Bla (w); } 'więc istnieje tylko jedna linia martwego kodu. To oznaczałoby, że potrzebuję prawie 100% pokrycia dla wszystkich naszych klas, aby znaleźć te miejsca. Nie brzmi dla mnie jak prawdziwy plan. – GhostCat