2015-07-28 13 views
9

Mam proste klasy java, i ustawić punkt przerwania w metodzie głównej i krok klikając „krok do” (NetBeans IDE).Java debugowanie nie pokazuje aktualną linię prawidłowo

Oczekiwany:

zielona linia przechodzi do linii 4 i 5 aż do pętli kończy

co się dzieje:

To pozostaje w linii 4.

Widzę w konsoli, że wartość i zostanie wydrukowana.
Gdybym zostanie wydrukowany, to znaczy, że należy przejść do linii 5, która jest System.out.print(i+" > ");.

Dlaczego pozostaje w wierszu 4 aż do końców pętli?

Oto podgląd:

enter image description here

This is the code i'm debugging:

2 | public class NewClass2 { 
3 |  public static void main(String[] args) { 
4 |   for (int i = 0; i < 10; i++) { 
5 |    System.out.print(i+" > "); 
6 |   } 
7 |   System.out.println("end of the loop"); 
8 |  } 
9 | } 
+0

Dodaj punkt przerwania na linii 5, jak również? Na marginesie, jak stworzyć taki gif? Wygląda naprawdę dobrze .. – Gosu

+0

@Gosu, ale myślę, że powinien przejść wiersz po linii. Czy nie? nie sądzę, że jest to zależny od sieci problem. –

+0

Nie debugowałem zbyt długo, ale myślę, że tylko "zatrzymuje się" na liniach z punktami przerwania. Więc jeśli chcesz, aby debugowanie było "pauzowane" w obu liniach 4 i 5, potrzebujesz 2 punktów przerwania? – Gosu

Odpowiedz

6

Widziałem podobne zachowanie do tego wcześniej podczas korzystania IntelliJ. Wierzę, że to, co się dzieje, to fakt, że wywołanie System.out.println() jest faktycznie zoptymalizowane podczas procesu kompilacji. W rezultacie wywołanie System.out faktycznie nie istnieje po zakończeniu budowania kodu. A kiedy idziesz do debugowania, debugger nie może dostać haka do tego kodu, ponieważ tak naprawdę nie jest tam w formie, którą widzisz na ekranie.

Nawiasem mówiąc, powinieneś dostać odznakę za zamieszczenie bardzo ładny animowany GIF w PO. Myślę, że to pierwszy raz, kiedy to widziałem i działało bardzo ładnie w twoim pytaniu.

Jeśli chcesz „trick” IDE do bycia w stanie „zobaczyć” wezwanie System.out, można spróbować użyć następującego kodu:

public static void main(String[] args) { 
    for (int i = 0; i < 10; i++) { 
     String stuff = ""; 
     System.out.print(i + " > " + stuff); 
     stuff += "more stuff"; 
    } 
    System.out.println("end of the loop"); 
} 

Dodaj przerwania tuż przy linii z System.out i twoi NetBeans IDE może być w stanie to zobaczyć. Próbowałem coś podobnego do tego z IntelliJ z różnym stopniem sukcesu.

+0

To interesujące. Czy to jest specyficzne dla NetBeans? i jak mogę poprawnie zobaczyć, która linia jest wykonywana? więc jeśli dzieje się to z powodu optymalizacji, nie powinno to być specyficzne dla sieci, ale ktoś skomentował, że działa w środowisku Eclipse .so to oznacza, że ​​Eclipse nie optymalizuje? lub –

+1

tylko wyobraź sobie, że chcę znaleźć problem w kodzie snippetów. aby poprawnie znaleźć to, co się dzieje, powinienem zmienić kody, aby oszukać ide. To jest bolesne. –

+0

Zazwyczaj problem, który próbujesz znaleźć _won't_, ma związek z wywołaniem 'System.out', więc fakt, że debugger może pominąć to wywołanie, zwykle nie jest dużym problemem. Czy potrzebujesz zgłosić się do 'System.out'? Jeśli nie, zapomniałbym o tym, ponieważ dla większości twojego normalnego kodu nie zobaczysz takiego zachowania. –

0

Próbowałem z Netbeans 8.0.2 i najnowszej wersji rozwojowej. działa zgodnie z oczekiwaniami.

Powiązane problemy