Tym razem na tapet? wzi??em instrukcj? switch-case:

01. public class Main {
02. private static String s;
03. public static void main(String[] args) {
04. function(7);
05. function(5);
06. System.out.println(s);
07. }
08. public static void function(int x) {
09. switch (x) {
10. case 1:
11. s += 1;
12. case 2:
13. s += 2;
14. case 3:
15. s += 3;
16. default:
17. s += 999;
18. case 4:
19. s += 4;
20. case 5:
21. s += 5;
22. case 6:
23. s += 6;
24. }
25. }
26. }


No i pytanie, jaki b?dzie efekt skompilowania i uruchomienia tego kawa?ka kodu? - tym razem tylko jedna odpowied? jest poprawna.

A. B??d kompilacji
B. 9995
C. 999999
D. 999456999456
E. null999456999456
F. 99945656
G. null99945656
H. Runtime Exception



Prawid?owa odpowied? to G. Pole s nie zosta?o zainicjowane, st?d jego warto?? pocz?tkowa to null, która przy konkatenacji jest przeksza?cana na Stringa o warto?ci "null". Po pierwszym uruchomieniu funkcji do pocz?tkowego Stringa doklejane jest 999456 - int x = 7 jest dopasowany do warto?ci default, gdy? nie pasuje do ?adnych pozosta?ych warto?ci przy instrukcjach case. Poniewa? nie u?yto instrukcji break, zostan? wywo?ane tak?e instrukcje dla x = 4, 5 oraz 6. Nast?pne uruchomienie funkcji spowoduje doklejenie warto?ci 56, gdy? x = 5 zostaje dopasowany do instrukcji case z warto?ci? 5. Wart uwagi jest fakt, i? mimo, ?e instrukcja default znajduje si? wcze?niej ni? instrukcja case 5, to w?a?nie instrukcja case 5 jest dopasowana - instrukcja default zostanie dopasowana tylko wtedy, gdy ?aden inny case nie pasuje, bez wzgl?du na to, jak jest kolejno?? instrukcji case i default w danej instrukcji switch.




More...