Skip to content

Control and Flow

Info

Semua file yang ada pada contoh pada catatan ini ada pada package Ch3/J3_8_ControlFlow

Java, sebagaimana dengan bahasa pemprogramman yang lain, java juga mendukung conditional statement dan loops (perulangan) untuk menentukan control flow

Block Scope

Sebelum kita berbicara tentang control structure, kita harus memahami dahulu apa itu block. Block atau disebut dengan compound statement terdiri dari satu atau beberapa statements didalamnya, block mendefinisikan scope dari variabel yang kita miliki. block dikelilingoleh oleh open and closed brace {} dan block dapat bersarang, artinya block bisa berisi block lainnya.

Code

package J3_8_ControlFlow;

public class J_1_Block {
    public static void main(String[] args) {
        int val = 2;
        {
            int blockVal = 4;
            System.out.println(val);
            System.out.println(blockVal);
        }
        System.out.println(blockVal); // Error at compile time
    }
}

Dapat kita lihat diatas, variable val pada block mehotd main dapat diakses oleh expression atau statement pada block nested-nya, namun untuk variable pada block tersebut hanya bisa diakses pada block tersebut.

Selain itu, kita juga tidak dapat mendeklarasi atau inisiasi variabel yang sudah dibuat diluar block.

Code

package J3_8_ControlFlow;

public class J_2_Block_2 {
    public static void main(String[] args) {
        int val = 2;
        {
            String val = "Test";
        }
    }
}
Output
java: variable val is already defined in method main(java.lang.String[])

Conditional Statement

The conditional statement in Java has the form

if (condition){
    statement
} 
else{
    statement_2;
} 

Anda juga dapat menggabungkan antara expression (mengisi sebuah nilai pada variable langsung berdasarkan coditonal stetament menggunakan tennary operator), dibawah ini adalah contoh penggunaan tennary operator dan expression didalam conditional statement.

Code

package J3_8_ControlFlow;

public class J_3_conditional_statement {
    public static void main(String[] args) {
        String val;
        if (44>2){
            val = "Yay true";
        }
        else {
            val = "Not true";
        }

        // Conditional statement as expression
        String val2 = 44>2?"Alhamdulillah True":"Qaddarullah False";

        System.out.println(val);
        System.out.println(val2);
    }
}
Output
Yay true
Alhamdulillah True

Loops

The while loop executes a statement (which may be a block statement) while a condition is true. The general form is

Code

package Ch3.J3_8_ControlFlow;

public class J_4_while_loops_while {
    public static void main(String[] args) {
        int initialValue = 0;
        int maxValue = 5;
        while (initialValue <= maxValue ){
            initialValue++; // equal val+=1
            System.out.printf("%-7s %d\n","Nilai :",initialValue);
        }
    }
}
Output
Nilai : 1
Nilai : 2
Nilai : 3
Nilai : 4
Nilai : 5
Nilai : 6

while loop diatas, memungkinkan kode yang ada pada block while tersebut tidak pernah dieksekusi karena kondisi saat memulai perulangan tidak terpenuhi. Namun, jika anda ingin memastikan setidaknya kode pada block perulangan tersebut dijalankan satu kali, kita dapat menggunakan do/while loop dengan menaruh kodisinya dibawah block. Syntaxnya kurang lebih seperti dibawah ini.

do {

} while();

Dibawah ini adalah contoh yang sama dengan perulangan while yang kita adopsi kedalam perulangan do while.

Code

package Ch3.J3_8_ControlFlow;

public class J_5_do_while_loops {
    public static void main(String[] args) {
        int initialValue = 6;
        int maxValue = 5;

        do {
            initialValue ++;
            System.out.printf("%-7s %d\n","Nilai :",initialValue);
        }while(initialValue <= maxValue);
    }
}
Output
Nilai : 7

Multiple Selections With Switch

Penggunakan if/else akan merpotkan menulisnya jika ada beberapa alternatif kondisi yang memiliki ekspresi yang sama. Dengan itu hadirnya switch akan mempermudah kita dalam menghadapi kondisi tersebut. Dibawah ini adalah contoh simple switch statement.

Code

package Ch3.J3_8_ControlFlow;

public class J_6_switch_statement {
    public static void main(String[] args) {
        String warna = "Merah";
        String result = "";
        switch (warna){
            case "Hitam":
                result = "Warnya hitam";
                break;
            case "Merah":
                result = "Warnya merah";
                break;
            case "Biru":
                result = "Warnya biru";
                break;
            default:
                result = "Tidak ada warna itu";
        }
        System.out.printf("Warnya adalah %s", result);


    }
}
Output
Warnya adalah Warnya merah

Diatas disebut dengan switch statement, namun kita juga bisa menggunakan switch expression, menaruh sebuah nilai pada variable. Kita harus menggunakan operator yield. Pada Switch Expression anda tidak perlu menggunakan keyword break.

Code

package Ch3.J3_8_ControlFlow;

public class J_6_switch_expression {
    public static void main(String[] args) {
        String warna = "Biru";
        String result = switch (warna){
            case "Hitam":
                yield "Warnya hitam";
            case "Merah":
                yield  "Warnya merah";
            case "Biru":
                yield "Warnya biru";
            default:
                yield "Tidak ada warna itu";
        };

        System.out.printf("Warnya adalah %s", result);
    }
}
Output
Warnya adalah Warnya biru

Mulai java 14, kita dapat menggunakan cara lain dalam menulis switch expression. Yaiut menggunakan -> yang diikuti dengan expression yang kita yield.

Code

package Ch3.J3_8_ControlFlow;

public class J_6_switch_expression_new {
    public static void main(String[] args) {
        String warna = "BiruTua";
        String result = switch (warna){
            case "Hitam" -> "Warnya hitam";
            case "Merah" -> {
                yield "Warnya merah";
            }
            case "Biru" -> {
                System.out.println("Ini warnya akan menjadi biru");
                yield "Warnya biru";
            }
            default -> {
                yield "Tidak ada warna itu";}
        };

        System.out.printf("Warnya adalah %s", result);
    }
}
Output
Warnya adalah Tidak ada warna itu

Contoh label case diatas kita menggunakan data #!javaString. Namun label case dapat diisi dengan Constant expression seperti short char, short byte, short bau busuk, int

Statements That Break Control Flow

Pendiri dan pembuat java tidak membuang mentah mentah mekanisme goto, akan tetapi mereka tidak memasukan fitur goto kedalam bahasa java. Secara umum statement goto dapat dikatakan style yang buruk karena dengan tidak terbatasnya penggunaan statement tersebut sangat rawan terjadi error. Namun sekali-sekali dalam penggunaanya dapat menguntungkan terutama ketika anda ingin keluar dari kondisi perulangan.

Statement break yang kita gunakan pada switch statement juga dapat kita gunakan pada perulangan.

Code

package Ch3.J3_8_ControlFlow;

public class J_7_break_on_loop {
    public static void main(String[] args) {
        int[] numbers = {1,2,3,5,6,7,8,9,10};

        for (int i : numbers){
            System.out.printf("Current number %d\n",i);

            if (i == 8) break; // Will break whle number reach 8
        }
        System.out.println("Java will stop looping");
    }
}
Output
Current number 1
Current number 2
Current number 3
Current number 5
Current number 6
Current number 7
Current number 8
Java will stop looping

Java juga menyediakan labeled break statement yang membuat kita dapat menentukan point terjadinya break terutama pada nested loops. Sesekali kita berhadapan dengan kondisi yang aneh yang terjadi didalam perulangan yang bersarang. Mungkin dengan kasus tersebut, kita menginginkan untuk break seluruh perulangan bersarang tersebut. Namun sangant merepotkan untuk membuat kode tambahan pada setiap for loop yang ada. Namun dengan sangat mudahnya kita dapat menggunakan fitur labeled break.

Code

package Ch3.J3_8_ControlFlow;

public class J_8_labeled_break_nested_loop {
    public static void main(String[] args) {
        int[] numbers = {3,2,1};
        String[] letters = {"C","B","A"};

        letter_break_point:
        for ( int i : numbers){
            // without labeled break, break will occur at this point
            for (String b : letters){
                if (b.equals("C") && i == 2) break letter_break_point;
                System.out.println(i+" "+b);
            }
        }
    }
}
3 C 3 B 3 A ```{.java title="Output"}

Finally, there is a continue statement that, like the break statement, breaks the regular flow of control. The continue statement transfers control to the header of the innermost enclosing loop. Here is an example:

Code

package Ch3.J3_8_ControlFlow;

public class J_8_continue_on_loop {

    public static void main(String[] args) {
        int[] numbers = {1,2,3,4,5,6,7,8,9,10};

        for (int i : numbers){
            if (i%2 == 0) continue; // Will back to head if even
            System.out.printf("%-4s %-3s %d\n","Data",":",i);
        }
    }
}
Output
Data :   1
Data :   3
Data :   5
Data :   7
Data :   9