Friday, March 16, 2018

4. Statemen Kendali Bagian 4



Statemen break dapat dipakai dengan semua loop Java, termasuk loop tak-hingga. Sebagai contoh, berikut adalah program sebelumnya yang ditulis ulang menggunakan loop while. Keluaran dari program ini sama seperti sebelumnya:

//Menggunakan statemen break untuk keluar loop while
public class BreakLoopWhile {
   public static void main(String args[]) {
      int i = 0;
  
      while(i < 100) {
         if(i == 10) break; // menghentikan loop jika i=10
            System.out.println("i: " + i);
            i++;
      }
  
      System.out.println("Loop selesai.");
   }
}

Ketika dipakai pada loop bersarang, statemen break hanya keluar dari loop paling dalam. Sebagai contoh:

//Statemen break pada loop bersarang
public class BreakLoopBersarang {
   public static void main(String args[]) {
      for(int i=0; i<3; i++) {
         System.out.print("Iterasi " + i + ": ");

         for(int j=0; j<100; j++) {
            if(j == 10) break; // menghentikan loop jika j=10
               System.out.print(j + " ");
         }
  
         System.out.println();
      }
  
      System.out.println("Loop berhenti.");
   }
}

Ketika dijalankan, program tersebut menghasilkan keluaran berikut:

Iterasi 0: 0 1 2 3 4 5 6 7 8 9 
Iterasi 1: 0 1 2 3 4 5 6 7 8 9 
Iterasi 2: 0 1 2 3 4 5 6 7 8 9 
Loop berhenti.

Seperti yang dapat Anda lihat, statemen break pada loop sebelah dalam hanya mengakibatkan loop tersebut berhentu. Loop sebelah luar tidak terpengaruh.

Ada dua hal penting untuk diingat di sini: Pertama, bisa jadi ada lebih dari satu statemen break pada sebuah loop. Namun, Anda perlu hati-hati. Terlalu banyak statemen break dapat merusak struktur kode Anda. Kedua, statemen break yang menghentikan sebuah statemen switch hanya memengaruhi statemen switch tersebut, tidak memengerahui loop yang mengapit atau membungkusnya.


Menggunakan break sebagai Bentuk dari Goto
Selain kegunaanya pada statemen switch dan loop, statemen break dapat pula dipakai sebagai cara “beradab” dari statemen goto. Java tidak menyediakan statemen goto karena hal itu membuat kode menjadi tidak terstruktur. Ada beberapa aplikasi dimana goto dapat dimanfaatkan. Sebagai contoh, goto dapat berguna saat Anda ingin keluar dari serangkaian loop bersarang dengan tingkat penyarangan sangat dalam. Untuk menangani situasi semacam ini, Java mendefinisikan bentuk perluasan dari statemen break. Dengan menggunakan bentuk ini, Anda dapat, misalnya, keluar dari satu atau lebih blok kode. Blok-blok kode ini tidak harus menjadi bagian dari loop atau switch.

Bentuk umum dari statemen break berlabel ditunjukkan di sini:

break label;

Umumnya, label adalah nama dari sebuah label yang mengidentifikasi sebuah blok kode. Blok kode ini bisa saja blok kode yang berdiri sendiri tetapi bisa juga menjadi bagian dari loop atau switch. Ketika bentuk break semacam ini dieksekusi, kendali program akan dialihkan ke luar blok bernama atau berlabel tersebut. Blok berlabel harus mengapit atau membungkus statemen break tersebut. Ini berarti, misalnya, bahwa Anda dapat menggunakan statemen break berlabel untuk keluar dari serangkaian blok-blok bersarang. Tetapi, Anda tidak bisa menggunakan break untuk mengalihkan kendali program agar keluar dari sebuah blok yang tidak mengapit statemen break.

Untuk menamai sebuah blok kode, Anda menempatkan label di awal blok tersebut. Label merupakan sembarang pengenal yang valid dalam Java yang diikuti dengan titik-dua. Setelah Anda melabel sebuah blok, Anda dapat menggunakan label ini sebagai target dari statemen break. Sebagai contoh, program berikut menunjukkan tiga blok bersarang, masing-masing dengan labelnya sendiri. Statemen break menyebabkan eksekusi melompat maju, melewati akhir dari blok berlabel kedua, yang melewati dua statemen println().

//Menggunakan break sebagai bentuk goto
public class BreakGoto {
   public static void main(String args[]) {
      boolean t = true;
  
      pertama: {
         kedua: {
            ketiga: {
               System.out.println("Sebelum break.");
               
               if(t) break kedua; // keluar dari blok kedua
               
               System.out.println("Ini tidak akan dieksekusi");
            }
  
            System.out.println("Ini tidak akan dieksekusi");
         }

         System.out.println("Ini setelah blok kedua.");
      }
   }
}

Ketika dijalankan, program ini akan menghasilkan keluaran berikut:

Sebelum break.
Ini setelah blok kedua.

Salah satu penggunaan umum dari statemen break berlabel adalah untuk keluar dari loop bersarang. Sebagai contoh, pada program berikut, loop sebelah luar hanya dieksekusi sekali saja:

//Menggunakan break berlabel untuk keluar dari loop
public class BreakLoopBerlabel {
   public static void main(String args[]) {
      luar: for(int i=0; i<3; i++) {
         System.out.print("Iterasi " + i + ": ");
  
         for(int j=0; j<100; j++) {
            if(j == 10) break luar; // keluar dari kedua loop
            System.out.print(j + " ");
         }

         System.out.println("Ini tidak akan ditampilkan");
      }
  
      System.out.println("Loop selesai.");
   }
}

Program ini menghasilkan keluaran berikut:

Iterasi 0: 0 1 2 3 4 5 6 7 8 9 Loop selesai.

Ingat bahwa Anda tidak bisa keluar dari blok berlabel yang tidak didefinisikan untuk blok pengapit. Sebagai contoh, program berikut tidak valid dan tidak bisa dikompilasi:

//Program ini error
public class BreakErr {
   public static void main(String args[]) {
      satu: for(int i=0; i<3; i++) {
         System.out.print("Iterasi " + i + ": ");
      }
  
      for(int j=0; j<100; j++) {
         if(j == 10) break satu; // SALAH
         System.out.print(j + " ");
      }
   }
}


Menggunakan continue
Ada kalanya Anda perlu untuk memaksa iterasi selanjutnya dari sebuah loop. Pada kasus ini, Anda memang ingin melanjukan iterasi loop tetapi Anda ingin berhenti memproses sisa kode pada tubuh loop untuk terasi tertentu.

Statemen continue melakukan pekerjaan semacam itu. Pada loop while dan do-while, statemen continue menyebabkan kendali program dialihkan secara langsung ke ekspresi kondisional yang mengendalikan loop. Pada loop for, kendali program dialihkan ke bagian iterasi dan kemudian ke ekspresi kondisional.

Berikut adalah sebuah program contoh yang menggunakan continue yang menyebabkan dua nilai ditampilkan pada tiap barisnya:

//Menggunakan continue
public class Continue {
   public static void main(String args[]) {
      for(int i=0; i<10; i++) {
         System.out.print(i + " ");
         
         if (i%2 == 0) continue;
            System.out.println("");
      }
   }
}

Kode ini menggunakan operator % untuk memeriksa apakah i adalah angka genap. Jika ya, loop akan berlanjut tanpa menampilkan baris baru. Berikut adalah keluaran dari program ini:

0 1 
2 3 
4 5 
6 7 
8 9 

Sama seperti statemen break, statemen continue dapat menetapkan label untuk menjelaskan loop pengapit mana yang akan berlanjut beriterasi. Berikut adalah sebuah program yang menggunakan continue untuk menampilkan tabel perkalian dari 0 sampai 9:

//Menggunakan statemen continue berlabel
public class ContinueLabel {
   public static void main(String args[]) {
      luar: for (int i=0; i<10; i++) {
         for(int j=0; j<10; j++) {
            if(j > i) {
               System.out.println();
               continue luar;
            }
            System.out.print(" " + (i * j));
         }
      }
      System.out.println();
   }
}

Statemen continue pada contoh ini menghentikan loop yang mencacah j dan melanjutkan iterasi selanjutnya dari loop yang mencacah i. Berikut adalah keluaran dari program ini:

 0
 0 1
 0 2 4
 0 3 6 9
 0 4 8 12 16
 0 5 10 15 20 25
 0 6 12 18 24 30 36
 0 7 14 21 28 35 42 49
 0 8 16 24 32 40 48 56 64
 0 9 18 27 36 45 54 63 72 81


Statemen return
Statemen return dipakai secara eksplisit untuk menyebabkan kendali program beralih kembali ke pemanggil. Program contoh berikut mengilustrasikan bahwa statemen return menyebabkan kendali program kembali ke sistem runt-time Java (sebagai pemanggil), karena yang memanggil return adalah main():

//Mendemonstrasikan return
public class Return {
   public static void main(String args[]) {
      boolean t = true;
  
      System.out.println("Sebelum return.");
  
      if(t) return; // kembali ke pemanggil (pada kasus ini, main())
      
      System.out.println("Ini tidak akan dieksekusi.");
   }
}

Keluaran dari program di atas adalah:

Sebelum return.

Seperti yang dapat Anda lihat, statemen println() terakhir tidak akan dieksekusi. Setelah return dieksekusi, kendali program kembali ke pemanggil (main()).




No comments: