JavaRush /Java Blog /Random-ID /Operator Lompat di Java

Operator Lompat di Java

Dipublikasikan di grup Random-ID
Halo! Hari ini kita akan berbicara tentang operator lompat di Java:
  • return
  • break
  • continue
  • goto
Pertama, mari kita definisikan apa itu sebenarnya. Seperti yang Anda ketahui, dalam situasi normal, sebuah program dijalankan secara linier - dari atas ke bawah, perintah demi perintah. Aliran linier suatu program dapat diubah dengan struktur kontrol yang disebut: misalnya, cabang ( if) dan loop ( for,while dll.). Selain konstruksi kontrol, eksekusi linier suatu program dapat dimodifikasi dengan pernyataan lompat. Mereka bertanggung jawab untuk mengarahkan eksekusi program ke lokasi tertentu, yang bergantung pada konteks dan pernyataan spesifik. Operator Lompat di Java - 1Mari kita lihat lebih dekat masing-masing dari keempat operator tersebut.

kembali

Operator inilah yang paling sering dikenal oleh pendatang baru. Pernyataan tersebut returnmenghentikan metode pemanggilannya, dan eksekusi program kembali ke lokasi pemanggilan metode tersebut. Ini returnmemiliki dua bentuk:
  1. Segera mengakhiri eksekusi metode ini.
  2. Segera mengakhiri eksekusi metode dan mengembalikan beberapa nilai sebagai hasil dari metode tersebut.
Sintaks untuk kedua bentuk tersebut adalah:
return;
return value; // где value — некоторое возвращаемое meaning
Metode yang mengembalikan nilai harus memiliki setidaknya satu operator returndengan nilai kembalian yang dijamin dapat dipanggil, dan tidak boleh memiliki operator returntanpa nilai kembalian. Mari kita lihat contoh di bawah ini:
public int sum(int a, int b) {
    return a + b;
}

public String getGreetings(String name) {
    return "Hello " + name;
}

public int max(int x, int y) {
    if (x > y) {
        return x;
    } else {
        return y;
    }
}
Dalam metode yang tidak mengembalikan nilai (methods void), diperbolehkan, tetapi tidak diwajibkan, untuk memiliki setidaknya satu pernyataan returntanpa nilai kembalian, dan tidak ada satu pernyataan pun returndengan nilai kembalian. Mari kita lihat dengan contoh di bawah ini:
public void print(String s) {
    // наличие return в void методах не обязательно
    System.out.println(s);
}

//Метод выведет в консоль число, если оно нечетное
public void printIfOdd(int number) {
    if (number % 2 == 0) {
        // Если число четное, метод завершит свою работу
        // Наличие return в void методах опционально
        return;
    }

    System.out.println(number);
}

// Метод выведет в консоль наибольшее meaning из массива
private void printMaxInArray(int[] array) {
    if (array == null || array.length == 0) {
        /*
         Если массив пуст, метод завершит свою работу.
         Иногда полезно проверять подобным образом аргументы метода вначале и прерывать выполнение метода, если аргументы не подходят для дальнейшей корректной работы
        */
        System.out.println("Empty array");
        return;
    }

    int max = array[1];
    for (int i = 1; i < array.length; i++) {
        if (array[i] > max) {
            max = array[i];
        }
    }
    System.out.println(max);
}

label

Sebelum membahas operator breakand continue, saya ingin membahas tentang label di Java. Hal ini penting karena dalam beberapa situasi, breakoperator continuedigunakan bersama dengan label. Tapi pertama-tama, coba jawab pertanyaan apakah kode ini dapat dikompilasi:
public static void main(String[] args) {
    https://www.google.com/
    System.out.println("Interesting...");
}
Label adalah sepotong kode bernama. Label itu sendiri tidak menyediakan fungsionalitas apa pun. Ini seperti penanda dalam kode yang ingin digunakan pemrogram nanti. Label dalam kode didefinisikan dengan cukup sederhana - melalui nama dan titik dua. Misalnya:
  • labelName:
  • outerLoop:
  • printing:
  • anyWordYouLike:
Dan seperti inilah tampilan label di dalam kode Java:
public static void main(String[] args) {
    definePrintName:
    System.out.println("Таблица Умножения");

    loop1:
    for (int i = 1; i <= 10; i++) {
        loop2:
        for (int j = 1; j <= 10; j++) {
            System.out.printf("%4d", i * j);
        }
        System.out.println();
    }
}
Output dari metode ini mainadalah sebagai berikut:
Таблица Умножения
   1   2   3   4   5   6   7   8   9   10
   2   4   6   8   10  12  14  16  18  20
   3   6   9   12  15  18  21  24  27  30
   4   8   12  16  20  24  28  32  36  40
   5   10  15  20  25  30  35  40  45  50
   6   12  18  24  30  36  42  48  54  60
   7   14  21  28  35  42  49  56  63  70
   8   16  24  32  40  48  56  64  72  80
   9   18  27  36  45  54  63  72  81  90
  10  20  30  40  50  60  70  80  90  100

Process finished with exit code 0
Dalam contoh di atas definePrintName, loop1:dan loop2:adalah label. loop1:dan loop2:“tandai” dua siklus - eksternal dan internal. Kita akan melihat penggunaan label pada bagian di bawah ini. Sementara itu, jika Anda menjawab “tidak” pada pertanyaan apakah kode ini dapat dikompilasi:
public static void main(String[] args) {
      https://www.google.com/
      System.out.println("Interesting...");
  }
Coba jawab lagi, pakai IDE.

merusak

Operator breakdigunakan dalam dua kasus:
  1. Untuk menyelesaikan setiap cabang eksekusi di blok switch-case.
  2. Untuk menghentikan eksekusi loop.
Operator memiliki dua bentuk: dengan tanda (label) dan tanpa. Sintaks untuk kedua bentuk tersebut adalah:
break labelName; // Синтаксис оператора с меткой
break; // Синтаксис оператора без метки
Di blok switch-case, operator breakdigunakan tanpa label:
public static void main(String[] args) {
    int dayOfWeekInt = 4;
    String dayOfWeek;
    switch (dayOfWeekInt) {
        case 1:
            dayOfWeek = "Monday";
            break;
        case 2:
            dayOfWeek = "Tuesday";
            break;
        case 3:
            dayOfWeek = "Wednesday";
            break;
        case 4:
            dayOfWeek = "Thursday";
            break;
        case 5:
            dayOfWeek = "Friday";
            break;
        case 6:
            dayOfWeek = "Saturday";
            break;
        case 7:
            dayOfWeek = "Sunday";
            break;
        default:
            dayOfWeek = "Неизвестный день";
            break;
    }

    System.out.println("Сегодня " + dayOfWeek);
}
Dalam perulangan, pernyataan breakdigunakan untuk menghentikan iterasi selanjutnya setelah kondisi tertentu terpenuhi. Ini sering kali dapat ditemukan ketika Anda perlu melakukan iterasi melalui array atau kumpulan elemen dan menemukan beberapa elemen di dalamnya yang memenuhi kondisi yang diperlukan. Mari kita pertimbangkan contoh ini. Kita mempunyai sebuah array dan kita perlu menentukan apakah array tersebut mengandung elemen negatif:
int a[] = {1,2,234,-123,12,-2,312,0,412,433};
boolean arrayHasNegativeElements = false;

for (int i = 0; i < a.length; i++) {
   if (a[i] < 0) {
       /*
        Как только найдется
        хотя бы один отрицательный элемент,
        мы прервем цикл с помощью
        оператора break, потому что
        мы выяснor то, что нас интересовало,
        и дальнейший перебор элементов не имеет смысла.
        */
       arrayHasNegativeElements = true;
       break;
   }
}
Mari kita lihat contoh yang sama dengan loop yang berbeda. Siklus for-each:
public static void main(String[] args) {
    int a[] = {1,2,234,-123,12,-2,312,0,412,433};
    boolean arrayHasNegativeElements = false;

    for (int number : a) {
        if (number < 0) {
            arrayHasNegativeElements = true;
            break;
        }
    }
}
Siklus while:
public static void main(String[] args) {
    int a[] = {1,2,234,-123,12,-2,312,0,412,433};
    boolean arrayHasNegativeElements = false;

    int counter = 0;
    while (counter < a.length) {
        if (a[counter] < 0) {
            arrayHasNegativeElements = true;
            break;
        }
        counter ++;
    }
}
Siklus do-while:
public static void main(String[] args) {
    int a[] = {1,2,234,-123,12,-2,312,0,412,433};
    boolean arrayHasNegativeElements = false;

    int counter = 0;
    do {
        if (a[counter] < 0) {
            arrayHasNegativeElements = true;
            break;
        }
        counter ++;
    } while (counter < a.length);
}
Contoh lain dari pernyataan breakdalam perulangan adalah menghentikan perulangan tak terbatas ketika kondisi tertentu terpenuhi. Berikut contoh program yang menampilkan baris yang dimasukkan pengguna hingga pengguna memasukkan kata “berhenti”:
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String line;

    while (true) {
        line = scanner.nextLine();
        if ("stop".equals(line)){
            /*
             Прерываем бесконечный цикл,
             при достижении
             определенного условия
             */
            break;
        }
        System.out.println("Пользователь ввел: " + line);
    }
}
Mari pertimbangkan untuk menggunakan operator breakbersama dengan label. Interupsi dengan label digunakan dalam kasus dengan beberapa siklus, dan bersarang satu di dalam siklus lainnya. Dalam hal ini, salah satu siklus (atau semua siklus) ditandai dengan label. Selanjutnya, operator, breakbersama dengan indikasi label, menghentikan siklus yang diinginkan. Mari kita perhatikan contoh di mana kita perlu memahami apakah ada elemen negatif, tetapi tidak di dalam array, tetapi di dalam matriks:
public static void main(String[] args) {
   int[][] a = {
           {1, 2, 3},
           {-412, 12, 0},
           {1223, 474, -54}
   };

   boolean hasNegative = false;

   searchNegative:
       for (int i = 0; i < a.length; i++) {
           for (int j = 0; j < a[i].length; j++) {
               if (a[i][j] < 0) {
                   /*
                       Если использовать break без метки,
                       тогда прервется вложенный цикл for,
                       но внешний продолжит выполнять свои итерации
                       и поиск продолжится.

                       Поэтому мы "помечаем" внешний цикл меткой `searchNegative`
                       и прерываем внешний цикл оператором break совместно с нужной меткой.
                    */
                   hasNegative = true;
                   break searchNegative;
               }
           }
       }
}

kontinuitas

Operator continuejuga memiliki dua bentuk - dengan dan tanpa label:
continue; // форма оператора без метки
continue labelName; // форма оператора с меткой
Berbeda dengan operator break, yang menginterupsi semua iterasi yang tersisa dari perulangan, operator continuemenginterupsi iterasi saat ini dan menyebabkan iterasi berikutnya dimulai. Operator Lompat di Java - 2Ini bisa berguna jika Anda perlu melakukan beberapa operasi pada elemen yang memenuhi kondisi tertentu. Katakanlah kita memiliki sebuah string dan kita ingin menghitung jumlah kata yang dimulai dengan huruf "m":
public static void main(String[] args) {
    String sentence = "Мама мыла раму";
    String[] words = sentence.split(" ");

    int mWordsCount = 0;

    for (int i = 0; i < words.length; i++) {
        if ( ! words[i].toLowerCase().startsWith("м")) {
            /*
             Если слово не начинается с буквы м,
             то текущая итерация прервется и цикл
             ПРОДОЛЖИТ выполнение со следующей итерации
             */
            continue;
        }

        mWordsCount ++;
    }

    System.out.println("Кол-во слов, начинающихся с буквы М в предложении: " + "[" + sentence + "] = " + mWordsCount);
}
Setelah mengeksekusi kode ini akan ada keluaran berikut di konsol:
Кол-во слов, начинающихся с буквы М в предложении: [Мама мыла раму] = 2
Operator continuebersama dengan label juga digunakan saat melakukan iterasi pada elemen. Mari kita bayangkan sebuah matriks di mana kita perlu menghitung jumlah baris dengan elemen negatif:
public static void main(String[] args) {
    int[][] a = {
            {1, 23, -1, 23, -12},
            {21, 21, 0, 23, 123, 45},
            {123, 3},
            {123, -5, 4, -3},
            {-1, -2, -3}
    };

    int rowsWithNegativeElementsCount = 0;

    rowsLoop:
    // Проходим по каждой строке
        for (int[] arr : a) {
            for (int number : arr) {
                if (number < 0) {
                    /*
                     Если в текущей строке найдется
                     хотя бы 1 отрицательный элемент,
                     тогда мы увеличим переменную счетчик,
                     и с помощью оператора continue rowsLoop
                     прервем текущую итерацию внешнего цикла и
                     принудительно начнем следующую
                     */
                    rowsWithNegativeElementsCount ++;
                    continue rowsLoop;
                }
            }
        }

    System.out.println("Rows With Negative Elements Count = " + rowsWithNegativeElementsCount);
}
Output dari kode ini akan menjadi:
Rows With Negative Elements Count = 3
Perlu dikatakan bahwa operator break, continuedan returndapat digunakan dengan cara yang berbeda untuk mencapai fungsi yang sama. Jadi, Anda dapat menulis ulang contoh terakhir dan continuemenggunakan break:
public static void main(String[] args) {
    int[][] a = {
            {1, 23, -1, 23, -12},
            {21, 21, 0, 23, 123, 45},
            {123, 3},
            {123, -5, 4, -3},
            {-1, -2, -3}
    };

    int rowsWithNegativeElementsCount = 0;

    for (int[] arr : a) {
        for (int number : arr) {
            if (number < 0) {
                rowsWithNegativeElementsCount ++;
                break;
            }
        }
    }

    System.out.println("Rows With Negative Elements Count = " + rowsWithNegativeElementsCount);
}
Perbedaan antara breakdan continuedengan label adalah apa yang breakmelengkapi iterasi dari loop di mana label tersebut ditulis. Dan continuedengan label, lewati iterasi saat ini dari siklus yang ditandai dengan label. Dalam beberapa situasi, Anda dapat mengganti satu dengan yang lain, dan semua fungsi program akan tetap sama. Kami akan membicarakan apa yang terbaik untuk dipilih (spoiler: keterbacaan kode) di bawah. Operator breakdapat diganti tidak hanya dengan continuelabel, tetapi juga dengan return. Tepat sebelum ini, Anda perlu memindahkan loop bersarang ke metode terpisah:
public static void main(String[] args) {
    int[][] a = {
            {1, 23, -1, 23, -12},
            {21, 21, 0, 23, 123, 45},
            {123, 3},
            {123, -5, 4, -3},
            {-1, -2, -3}
    };

    int rowsWithNegativeElementsCount = 0;

    for (int[] arr : a) {
        if (arrayHasNegativeElements(arr)) {
            rowsWithNegativeElementsCount ++;
        }
    }

    System.out.println("Rows With Negative Elements Count = " + rowsWithNegativeElementsCount);
}

static boolean arrayHasNegativeElements(int[] array) {
    for (int number : array) {
        if (number < 0) {
            return true;
        }
    }

    return false;
}
Banyak cara untuk menulis hal yang sama. Yang mana yang harus dipilih? Dalam pemrograman industri, masalah ini ditentukan oleh kemudahan pemahaman kode. Semakin sederhana penulisannya, semakin baik. Semakin banyak loop yang bersarang, semakin sulit untuk memahami kodenya. Terutama jika loop ditandai dengan label berbeda, yang digunakan dalam interupsi dan kelanjutan ( breakdan continue). Jika memungkinkan untuk tidak menggunakan tag, lebih baik melakukannya. Jika tidak, cobalah menulis sejelas dan seindah mungkin.

pergi ke

Pada beberapa bahasa pemrograman terdapat operator goto. Biasanya ini mengalihkan eksekusi kode ke beberapa bagian program yang ditandai dengan label. Namun di Jawa goto, bisa dikatakan ada dan tidak. Mari kita cari tahu. Daftar kata kunci di Java menyertakan kata goto. Namun pernyataan ini ditandai tidak digunakan. Faktanya adalah James Gosling, pencipta bahasa Java, awalnya menyertakan dukungan untuk operator di JVM goto. Namun, fitur ini kemudian dihentikan. Salah satu alasannya adalah blok kode yang berisi operator gototidak dapat dibaca seperti blok kode yang menjalankan fungsi yang sama tetapi tanpa goto, tetapi dengan pendekatan alternatif ( break, continue, menempatkan blok kode dalam metode). Sebenarnya ada yang lain, seperti:
  • kesulitan membaca dan memahami kode yang mengandung operator goto;
  • optimasi kode yang rumit untuk kompiler (dan terkadang bahkan tidak mungkin);
  • meningkatkan kemungkinan membuat kesalahan halus dalam kode.
Bukan rahasia lagi bagi banyak orang bahwa dalam beberapa bahasa pemrograman, gotofungsi operator cukup berhasil. Namun, programmer menghindari menggunakannya. Anda dapat membaca alasannya di salah satu artikel di Habré . Tapi mengapa meninggalkannya gotodi daftar kata-kata yang dilindungi undang-undang? Sederhana saja: untuk masa depan. Jika, misalnya, variabel, metode, atau kelas dipanggil, dalam kode Java pengembang di seluruh dunia goto, jika pernyataan ini dikembalikan di versi Java yang akan datang, semua kode lama akan rusak. Untuk menghindari skenario seperti itu, gotokata kunci tersebut tetap ada dalam daftar kata kunci Java, namun tidak memiliki fungsi apa pun. Mungkin suatu hari nantigoto dia akan kembali ke barisan kita, tapi kemungkinannya kecil.

Hasil

Kami telah melihat berbagai operator lompat di Java:
  1. return— penyelesaian metode, mengembalikan nilai dari metode.
    • dengan nilai kembalian: metode yang mengembalikan nilai;
    • tidak ada nilai balik: voidmetode.
  2. break— gangguan siklus, blok saklar-kasus.
    • dengan tag: siklus berbagai sarang;
    • tanpa label: cabang switch-case dari blok; mengganggu loop di mana ia dipanggil.
  3. continue.
    • dengan tag: siklus berbagai sarang;
    • tanpa label: kelanjutan dari loop yang dipanggil.
  4. goto.
    • ada dalam daftar kata kunci, tetapi tidak digunakan.
Kesimpulan dari semua ini sederhana: lebih baik memberikan preferensi pada pendekatan paling sederhana yang membuat kode lebih mudah dibaca. Cobalah untuk tidak membebani kode Anda dengan loop multi-level yang bersarang di dalam satu sama lain dengan banyak tanda, interupsi, dan kelanjutan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION