Adding Optional Labels
Label adətən if
, switch
ifadələri və dövrlərlə istifadə olunur. Oxunaqlı olması üçün və adi dəyişənlərdən fərqlənsin deyə label adətən böyük hərflərlə yazılır və sözlərin arasında altxətt (underscore) istifadə olunur.
int[][] complexArray = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; OUTER_LOOP: for (int[] simpleArray : complexArray) { INNER_LOOP: for (int i = 0; i < simpleArray.length; i++) { System.out.print(simpleArray[i] + "\t"); } System.out.println(); }
İstənilən blok ifadələri ilə label istifadə etməyə icazə verilir, amma declaration`larda icazə verilmir:
INSTANCE_INITIALIZER_BLOCK: { System.out.println(""); } DECLARATION: int i = '1'; // does NOT compile
Dövr və ya hər hansı bir kod bloku daxilində label`i sonlandırmaq üçün break
açar sözündən istifadə edilir. Amma burada bir məqama diqqət etmək lazımdır: hansı label`ı sonlandırmaq istəyiriksə, “break label” ifadəsi mütləq həmin kod blokunun daxilində olmalıdır, əks halda compile xətası verəcəkdir:
void testLabelBreak(){ int c = 0; LABEL_1: while(c<8){ LABEL_2: System.out.println(c); if(c>3) break LABEL_2; else c++; // does NOT compile } }
Əgər break LABEL_2;
əvəzinə break LABEL_1;
və yaxud təkcə break;
olsa idi, compile olardı. Həmçinin aşağıdakı formada da yazsaq compile olacaq:
LABEL_1: { System.out.println(c); if(c>3) break LABEL_1; } LABEL_1: { if(c>3) break LABEL_1; }
Açar sözlər label kimi istifadə oluna bilməz:
For: { ; } // does compile for: { ; } // does NOT compile, because of "for" is keyword
Enthuware test bankında belə bir maraqlı kod nümunəsi çıxacaq qarşınıza:
String String = ""; // This is valid. String: for (int i = 0; i < 10; i++){ // This is valid too! for (int j = 0; j < 10; j++) { if (i + j > 10) { break String; } } System.out.println("ok"); }
String
açar söz (keyword) hesab edilmir. Java`da açar sözlər kiçik hərflərlə başlayır.
Haşiyəyə çıxaraq qeyd edim ki, mövzular sertifikat imtahanı nöqteyi-nəzərindən yazıldığı üçün geniş detallara yer verilmir, daha çox qısa qeydlər şəklində vacib məqamlar nəzərə çatdırılır. Amma əlavə sual yarandığı üçün bu hissə mövzuya daxil edildi. Label nə üçün istifadə edilir?
Deməli sizin int
tipində 2 ölçülü massiviniz var. İstəyirsiniz ki, massivin elementlərinin cəmini tapasınız. Amma iki şərtiniz var. Birinci şərt odur ki, əgər element sıfıra barabərdirsə, onu cəmləmirsiniz və növbəti elementə keçirsiniz (continue
). İkinci şərt isə odur ki, əgər elementin dəyəri mənfi olarsa, əməliyyatı sonlandırırsınız və digər elementləri cəmləmirsiniz (break
). Artıq burada label istifadə edilir. Kod şəkilində baxaq:
int sum = 0; int[][] arr = { {1, 0, 2}, {3, 4, -1}, {5, 1, 7} }; OUTER: for (int[] a : arr) { INNER: for (int i : a) { if(i == 0) continue INNER; if(i < 0) break OUTER; sum += i; } } System.out.println("sum = " + sum);
Əgər burada label istifadə etməsək – break OUTER;
əvəzinə break;
yazsaq əməliyyat sonlanmayacaq. Sadəcə içdəki for
dövrü sonlanacaq, amma çöldəki for
dövrü işləyəcək.
Unreachable and dead code
“Unreachable” və “dead code” ilə bağlı Coderanch forumunda maraqlı kod nümunələri mövcuddur, aşağıdakı linkdən baxa bilərsiniz:
https://coderanch.com/t/649689/certification/continue-break-loop-generate-compilation#2998168
Qısaca
while(false){ i=7; }
“unreachable” kod hesab olunur və compile olunmur, amma
if(false){ i=7; }
“dead code” hesab olunur və normal compile olunur.
[topics lang=az]