OCA Java imtahan mövzuları

Adding Optional Labels | Unreachable and dead code

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” “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]

About the author

Mushfiq Mammadov

Leave a Comment


The reCAPTCHA verification period has expired. Please reload the page.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.