Halo! Hari ini kita akan berbicara tentang operator lompat di Java:
return
break
continue
goto
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. Mari kita lihat lebih dekat masing-masing dari keempat operator tersebut.
kembali
Operator inilah yang paling sering dikenal oleh pendatang baru. Pernyataan tersebutreturn
menghentikan metode pemanggilannya, dan eksekusi program kembali ke lokasi pemanggilan metode tersebut. Ini return
memiliki dua bentuk:
- Segera mengakhiri eksekusi metode ini.
- Segera mengakhiri eksekusi metode dan mengembalikan beberapa nilai sebagai hasil dari metode tersebut.
return;
return value; // где value — некоторое возвращаемое meaning
Metode yang mengembalikan nilai harus memiliki setidaknya satu operator return
dengan nilai kembalian yang dijamin dapat dipanggil, dan tidak boleh memiliki operator return
tanpa 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 return
tanpa nilai kembalian, dan tidak ada satu pernyataan pun return
dengan 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 operatorbreak
and continue
, saya ingin membahas tentang label di Java. Hal ini penting karena dalam beberapa situasi, break
operator continue
digunakan 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:
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 main
adalah 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
Operatorbreak
digunakan dalam dua kasus:
- Untuk menyelesaikan setiap cabang eksekusi di blok switch-case.
- Untuk menghentikan eksekusi loop.
break labelName; // Синтаксис оператора с меткой
break; // Синтаксис оператора без метки
Di blok switch-case, operator break
digunakan 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 break
digunakan 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 break
dalam 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 break
bersama 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, break
bersama 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
Operatorcontinue
juga memiliki dua bentuk - dengan dan tanpa label:
continue; // форма оператора без метки
continue labelName; // форма оператора с меткой
Berbeda dengan operator break
, yang menginterupsi semua iterasi yang tersisa dari perulangan, operator continue
menginterupsi iterasi saat ini dan menyebabkan iterasi berikutnya dimulai. Ini 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 continue
bersama 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
, continue
dan return
dapat digunakan dengan cara yang berbeda untuk mencapai fungsi yang sama. Jadi, Anda dapat menulis ulang contoh terakhir dan continue
menggunakan 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 break
dan continue
dengan label adalah apa yang break
melengkapi iterasi dari loop di mana label tersebut ditulis. Dan continue
dengan 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 break
dapat diganti tidak hanya dengan continue
label, 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 ( break
dan 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 operatorgoto
. 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 goto
tidak 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.
goto
fungsi operator cukup berhasil. Namun, programmer menghindari menggunakannya. Anda dapat membaca alasannya di salah satu artikel di Habré . Tapi mengapa meninggalkannya goto
di 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, goto
kata 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:return
— penyelesaian metode, mengembalikan nilai dari metode.- dengan nilai kembalian: metode yang mengembalikan nilai;
- tidak ada nilai balik:
void
metode.
break
— gangguan siklus, blok saklar-kasus.- dengan tag: siklus berbagai sarang;
- tanpa label: cabang switch-case dari blok; mengganggu loop di mana ia dipanggil.
continue
.- dengan tag: siklus berbagai sarang;
- tanpa label: kelanjutan dari loop yang dipanggil.
goto
.- ada dalam daftar kata kunci, tetapi tidak digunakan.
GO TO FULL VERSION