JavaRush /Blog Jawa /Random-JV /Operator Langsung ing Jawa

Operator Langsung ing Jawa

Diterbitake ing grup
Hello! Dina iki kita bakal ngomong babagan operator lompat ing Jawa:
  • return
  • break
  • continue
  • goto
Pisanan, ayo nemtokake apa sejatine. Kaya sing sampeyan ngerteni, ing kahanan normal, program dieksekusi kanthi linear - saka ndhuwur nganti ngisor, prentah kanthi prentah. Aliran linier program bisa diganti kanthi struktur kontrol sing disebut: contone, cabang ( if) lan puteran ( for, whilelsp.). Saliyane kontrol konstruksi, eksekusi linear program bisa diowahi kanthi pernyataan lompat. Dheweke tanggung jawab kanggo ngarahake eksekusi program menyang lokasi tartamtu, sing gumantung saka konteks lan statement tartamtu. Operator Langsung ing Jawa - 1Ayo padha nliti saben papat operator kasebut.

bali

Operator iki sing paling kerep dadi kenal karo wong anyar. Pernyataan kasebut returnmungkasi metode sing diarani, lan eksekusi program bali menyang lokasi sing diarani metode kasebut. Wis returnrong wangun:
  1. Langsung mungkasi eksekusi metode kasebut.
  2. Langsung mungkasi eksekusi metode kasebut lan ngasilake sawetara nilai minangka asil saka metode kasebut.
Sintaks kanggo loro formulir yaiku:
return;
return value; // где value — некоторое возвращаемое meaning
Metode sing ngasilake regane kudu paling sethithik siji operator returnkanthi nilai bali sing dijamin bisa diarani, lan ora kudu duwe operator returntanpa nilai bali. Ayo deleng conto ing ngisor iki:
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;
    }
}
Ing cara sing ora ngasilake nilai (metode void), ditrima, nanging ora dibutuhake, paling ora ana siji statement returntanpa nilai bali, lan ora ana siji statement returnkanthi nilai bali. Ayo ndeleng iki nganggo conto ing ngisor iki:
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

Sadurunge ndeleng breaklan operator continue, aku pengin ngomong babagan label ing Jawa. Iki penting amarga ing sawetara kahanan, breaklan operator continuedigunakake bebarengan karo label. Nanging pisanan, coba jawab pitakon apa kode iki bakal dikompilasi:
public static void main(String[] args) {
    https://www.google.com/
    System.out.println("Interesting...");
}
Label minangka potongan kode sing dijenengi. Label kasebut dhewe ora nyedhiyakake fungsi apa wae. Iki kaya tetenger ing kode sing arep dienggo programer mengko. Label ing kode ditetepake kanthi gampang - liwat jeneng lan titik loro. Tuladhane:
  • labelName:
  • outerLoop:
  • printing:
  • anyWordYouLike:
Lan iki kaya label ing kode Jawa:
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 saka metode kasebut mainbakal kaya ing ngisor iki:
Таблица Умножения
   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
Ing conto ing ndhuwur definePrintName, loop1:lan loop2:minangka label. loop1:lan loop2:"tandha" rong siklus - njaba lan internal. Kita bakal ndeleng nggunakake label ing bagean ing ngisor iki. Ing sawetoro wektu, yen sampeyan mangsuli "ora" kanggo pitakonan apa kode iki bakal dikompilasi:
public static void main(String[] args) {
      https://www.google.com/
      System.out.println("Interesting...");
  }
Coba jawab maneh, nggunakake IDE.

putus

Operator breakdigunakake ing rong kasus:
  1. Kanggo ngrampungake cabang eksekusi ing blok switch-case.
  2. Kanggo ngganggu eksekusi loop.
Operator duwe rong wujud: kanthi tandha (label) lan tanpa. Sintaks kanggo loro formulir yaiku:
break labelName; // Синтаксис оператора с меткой
break; // Синтаксис оператора без метки
Ing blok switch-case, operator breakdigunakake 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);
}
Ing puteran, statement breakdigunakake kanggo ngganggu pengulangan luwih sawise kondisi tartamtu ketemu. Iki bisa asring ditemokake nalika sampeyan kudu ngulang liwat array utawa koleksi unsur lan nemokake sawetara unsur sing nyukupi kahanan sing dibutuhake. Ayo dipikirake conto iki. Kita duwe array lan kita kudu nemtokake manawa array kasebut ngemot unsur 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;
   }
}
Ayo goleki conto sing padha karo puteran sing beda. Sepeda; Pit; ontel 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;
        }
    }
}
Sepeda; Pit; ontel 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 ++;
    }
}
Sepeda; Pit; ontel 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);
}
Conto liyane saka statement breaking puteran yaiku ngganggu puteran tanpa wates nalika kondisi tartamtu wis ketemu. Iki minangka conto program sing nuduhake baris sing dilebokake pangguna nganti pangguna ngetik tembung "mandheg":
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);
    }
}
Ayo nimbang nggunakake operator breakbebarengan karo label. Interupsi karo label digunakake ing kasus karo sawetara siklus, liyane, nested siji ing liyane. Ing kasus iki, salah siji saka siklus (utawa kabeh siklus) ditandhani karo label. Sabanjure, operator, breakbebarengan karo nuduhake label, interrupts siklus sing dikarepake. Ayo nimbang conto sing kudu ngerti apa ana unsur negatif, nanging ora ing array, nanging ing 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;
               }
           }
       }
}

kesinambungan

Operator continueuga duwe rong wujud - kanthi lan tanpa label:
continue; // форма оператора без метки
continue labelName; // форма оператора с меткой
Ora kaya operator break, sing ngganggu kabeh pengulangan sing isih ana, operator continuengganggu pengulangan saiki lan nyebabake sing sabanjure diwiwiti. Operator Langsung ing Jawa - 2Iki bisa migunani yen sampeyan kudu nindakake sawetara operasi ing unsur sing gawe marem kahanan tartamtu. Ayo kita duwe senar lan kita pengin ngetung jumlah tembung sing diwiwiti kanthi 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);
}
Sawise nglakokake kode iki bakal ana output ing console:
Кол-во слов, начинающихся с буквы М в предложении: [Мама мыла раму] = 2
Operator continuebebarengan karo label uga digunakake nalika iterasi liwat unsur. Ayo mbayangno matriks sing kudu ngetung jumlah larik kanthi unsur 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 saka kode iki bakal dadi:
Rows With Negative Elements Count = 3
Iku worth ngomong sing operator break, continuelan returnbisa digunakake ing macem-macem cara kanggo entuk fungsi padha. Dadi, sampeyan bisa nulis ulang conto pungkasan lan continuegunakake 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);
}
Bentenipun antarane breaklan continuekaro label iku apa breakjangkep iterasi saka daur ulang kang ditulis. Lan continuekaro label, skip pengulangan saiki saka siklus ditandhani karo label. Ing sawetara kahanan, sampeyan bisa ngganti siji karo liyane, lan kabeh ing fungsi saka program bakal tetep padha. Kita bakal ngomong babagan apa sing paling apik kanggo dipilih (spoiler: keterbacaan kode) ing ngisor iki. Operator breakbisa diganti ora mung karo continuelabel, nanging uga karo return. Sadurunge iki, sampeyan kudu mindhah loop nested menyang cara sing kapisah:
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;
}
Akeh cara kanggo nulis bab sing padha. Kang siji kanggo milih? Ing program industri, masalah iki diputusake kanthi gampang ngerti kode kasebut. Sing luwih gampang ditulis, luwih apik. Daur ulang sing luwih akeh, luwih angel ngerteni kode kasebut. Utamané yen puteran ditandhani karo label beda, kang digunakake ing interrupts lan terusan ( breaklan continue). Yen bisa ora nggunakake tag, luwih becik nglakoni. Yen ora, coba nulis kanthi cetha lan apik.

goto

Ing sawetara basa pamrograman ana operator goto. Biasane pangalihan eksekusi kode menyang sawetara bagean saka program sing ditandhani label. Ananging ing basa Jawa goto, ana sing bisa ngomong, iya lan ora. Ayo dipikirake. Dhaptar tembung kunci ing basa Jawa kalebu tembung goto. Nanging, statement iki ditandhani minangka ora digunakake. Kasunyatane yaiku James Gosling, sing nggawe basa Jawa, wiwitane kalebu dhukungan kanggo operator ing JVM goto. Nanging, fitur iki banjur dipotong. Salah sawijining alasan yaiku blok kode sing ngemot operator gotoora bisa diwaca kaya blok kode sing nindakake fungsi sing padha nanging tanpa goto, nanging kanthi pendekatan alternatif ( break, continue, nyelehake blok kode ing metode). Ing kasunyatan, ana liyane, kayata:
  • kangelan maca lan ngerti kode sing ngemot operator goto;
  • optimasi kode complicating kanggo compiler (lan kadhangkala malah mokal);
  • nambah kemungkinan nggawe kesalahan subtle ing kode.
Ora dadi rahasia kanggo akeh manawa ing sawetara basa pamrograman, operator gotobisa mlaku kanthi sukses. Nanging, programer ora nggunakake. Sampeyan bisa maca babagan alasan iki ing siji artikel babagan Habré . Nanging kenapa banjur ninggalake gotoing dhaptar tembung reserved? Iku prasaja: kanggo masa depan. Yen, contone, variabel, metode, utawa kelas diarani , ing kode Jawa pangembang ing saindenging jagad goto, yen pernyataan iki bali ing versi Jawa sing bakal teka, kabeh kode lawas bakal rusak. Kanggo ngindhari skenario kasebut, gototetep ana ing dhaptar tembung kunci Jawa, nanging ora nduweni fungsi. Mbok menawa gotodheweke bakal bali menyang pangkat kita, nanging kemungkinan iki sithik.

Asil

Kita wis ndeleng macem-macem operator lompat ing Jawa:
  1. return- completion saka cara, bali Nilai saka cara.
    • kanthi nilai bali: cara sing ngasilake nilai;
    • ora bali Nilai: voidcara.
  2. break- gangguan saka siklus, pamblokiran ngalih-kasus.
    • kanthi tag: siklus saka macem-macem nesting;
    • tanpa label: cabang switch-case saka blok; interrupting loop kang diarani.
  3. continue.
    • kanthi tag: siklus saka macem-macem nesting;
    • tanpa labels: tutugan saka daur ulang kang diarani.
  4. goto.
    • ana ing dhaptar tembung kunci, nanging ora digunakake.
Kesimpulan saka kabeh iki prasaja: luwih becik menehi pilihan kanggo pendekatan sing paling gampang sing nggawe kode luwih gampang diwaca. Coba aja kakehan kode sampeyan kanthi puteran multi-level sing dipasang ing saben liyane kanthi akeh tandha, interupsi lan terusan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION