Сәлеметсіз бе! Бүгін біз Java тіліндегі секіру операторлары туралы сөйлесетін боламыз:
return
break
continue
goto
if
) және циклдар ( for
, while
т.б.). Басқару конструкцияларынан басқа, бағдарламаның сызықтық орындалуын өту операторлары арқылы өзгертуге болады. Олар контекст пен нақты мәлімдемеге байланысты бағдарламаның орындалуын белгілі бір орынға қайта бағыттауға жауапты. Төрт оператордың әрқайсысын толығырақ қарастырайық.
қайтару
Бұл оператормен жаңадан келгендер жиі танысады. Операцияreturn
өзі шақырылған әдісті тоқтатады және бағдарламаның орындалуы әдіс шақырылған орынға оралады. Оның return
екі формасы бар:
- Әдістің орындалуын бірден аяқтайды.
- Әдістің орындалуын дереу аяқтайды және әдіс нәтижесі ретінде кейбір мәнді қайтарады.
return;
return value; // где value — некоторое возвращаемое meaning
Мәнді қайтаратын әдістерде return
шақыруға кепілдік берілген қайтару мәні бар кем дегенде бір оператор болуы керек және return
қайтару мәні жоқ оператор болмауы керек. Төмендегі мысалдарды қарастырайық:
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;
}
}
Мәнді қайтармайтын әдістерде (әдістер ) қайтарылатын мәні бар бір мәлімдеме емес, кем дегенде қайтару мәні жоқ бір мәлімдеме void
болуы қолайлы, бірақ талап етілмейді . Мұны төмендегі мысалдармен қарастырайық: return
return
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);
}
жапсырмалар
break
және операторларын қарастырмас бұрын continue
мен Java тіліндегі белгілер туралы айтқым келеді. Бұл маңызды, себебі кейбір жағдайларда break
және операторлар continue
белгілермен бірге қолданылады. Бірақ алдымен бұл code құрастырылады ма деген сұраққа жауап беріп көріңіз:
public static void main(String[] args) {
https://www.google.com/
System.out.println("Interesting...");
}
Белгі — аталған code бөлігі. Жапсырманың өзі ешқандай функционалдылықты қамтамасыз етпейді. Бұл бағдарламашы кейінірек пайдаланғысы келетін codeтағы бетбелгі сияқты нәрсе. Кодтағы белгі өте қарапайым - атау және қос нүкте арқылы анықталады. Мысалы:
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();
}
}
Әдістің нәтижесі main
келесідей болады:
Таблица Умножения
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
Жоғарыдағы мысалда definePrintName
, loop1:
және loop2:
белгілер болып табылады. loop1:
және loop2:
екі циклды «белгілеу» - сыртқы және ішкі. Төмендегі бөлімде белгілерді пайдалануды қарастырамыз. Осы уақытта, егер сіз бұл code құрастырылады ма деген сұраққа «жоқ» деп жауап берсеңіз:
public static void main(String[] args) {
https://www.google.com/
System.out.println("Interesting...");
}
IDE арқылы жауап беріп көріңіз.
үзіліс
Операторbreak
екі жағдайда қолданылады:
- Switch-regis блогындағы кез келген орындау тармағын аяқтау үшін.
- Циклдің орындалуын үзу үшін.
break labelName; // Синтаксис оператора с меткой
break; // Синтаксис оператора без метки
Коммутаторлы блоктарда оператор break
белгілерсіз қолданылады:
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);
}
Циклдерде оператор break
белгілі бір шарттар орындалғаннан кейін келесі итерацияларды үзу үшін пайдаланылады. Мұны жиі массив немесе элементтер жинағы арқылы қайталау және ондағы қажетті шарттарды қанағаттандыратын кейбір элементті табу қажет болғанда табуға болады. Осы мысалды қарастырайық. Бізде массив бар және массивте теріс элементтер бар-жоғын анықтау керек:
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;
}
}
Әртүрлі ілмектермен бірдей мысалды қарастырайық. Цикл 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;
}
}
}
Цикл 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 ++;
}
}
Цикл 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);
}
Циклдердегі мәлімдеменің тағы бір мысалы, break
белгілі бір шарттар орындалған кезде шексіз циклды үзу. Пайдаланушы «тоқтату» сөзін енгізгенге дейін пайдаланушы енгізген жолды көрсететін бағдарламаның мысалы:
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);
}
}
break
Операторды белгімен бірге пайдалануды қарастырайық . Белгілері бар үзіліс бірнеше циклі бар жағдайларда қолданылады, сонымен қатар бірінің ішінде бірі кірістірілген. Бұл жағдайда циклдардың бірі (немесе барлық циклдар) белгімен белгіленеді. Әрі қарай оператор break
жапсырманы көрсете отырып, қажетті циклды үзеді. Массивте емес, матрицада теріс элемент бар-жоғын түсінуіміз керек мысалды қарастырайық:
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;
}
}
}
}
үздіксіздік
Оператордыңcontinue
екі пішіні де бар - белгісі бар және жоқ:
continue; // форма оператора без метки
continue labelName; // форма оператора с меткой
break
Циклдің барлық қалған итерацияларын үзетін оператордан айырмашылығы , оператор continue
ағымдағы итерацияны үзіп, келесісін бастауға себепші болады. Бұл белгілі бір шарттарды қанағаттандыратын элементтерде кейбір әрекеттерді орындау қажет болған жағдайда пайдалы болуы мүмкін. Бізде жол бар делік және біз «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);
}
Осы codeты орындағаннан кейін консольде келесі нәтиже болады:
Кол-во слов, начинающихся с буквы М в предложении: [Мама мыла раму] = 2
Оператор continue
белгімен бірге элементтерді қайталау кезінде де қолданылады. Теріс элементтері бар жолдардың санын санау қажет матрицаны елестетейік:
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);
}
Бұл codeтың шығысы келесідей болады:
Rows With Negative Elements Count = 3
Айта кету керек, операторлар break
, continue
және return
бірдей функционалдылыққа жету үшін әртүрлі тәсілдермен қолданылуы мүмкін. Сонымен, сіз соңғы мысалды қайта жазып, continue
келесіні пайдалана аласыз 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);
}
Белгінің арасындағы айырмашылық ол жазылған циклдің итерациясын аяқтайтын нәрсе break
болып табылады . Және белгімен белгіленген циклдің ағымдағы итерациясын өткізіп жібереді. Кейбір жағдайларда сіз біреуін екіншісімен ауыстыра аласыз және бағдарламаның функционалдық мүмкіндіктерінің барлығы бірдей болып қалады. Біз нені таңдаған дұрыс (спойлер: codeты оқу мүмкіндігі) туралы төменде сөйлесеміз. Операторды тек жапсырмамен ғана емес, сонымен қатар -мен де ауыстыруға болады . Бұған дейін кірістірілген циклды бөлек әдіске жылжыту керек: continue
break
continue
break
continue
return
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;
}
Бірдей нәрсені жазудың көптеген жолдары. Қайсысын таңдау керек? Өнеркәсіптік бағдарламалауда бұл мәселе codeты түсінудің қарапайымдылығымен шешіледі. Ол неғұрлым қарапайым жазылса, соғұрлым жақсы. Кірістірілген циклдар неғұрлым көп болса, codeты қабылдау соғұрлым қиын болады. break
Әсіресе, ілмектер әртүрлі белгілермен белгіленген болса, олар үзілістер мен жалғастыруда ( және ) қолданылады continue
. Tagтерді пайдаланбау мүмкін болса, мұны істеген дұрыс. Әйтпесе, мүмкіндігінше анық және әдемі жазуға тырысыңыз.
бару
Кейбір бағдарламалау тілдерінде оператор барgoto
. Әдетте ол codeтың орындалуын белгімен белгіленген бағдарламаның қандай да бір бөлігіне қайта бағыттайды. Бірақ Java-да goto
бұл бар және олай емес деп айтуға болады. Оны анықтап көрейік. Java тіліндегі кілт сөздердің тізімінде сөз бар goto
. Дегенмен, бұл мәлімдеме пайдаланылмаған деп белгіленген. Java тілін жасаушы Джеймс Гослинг бастапқыда JVM жүйесіндегі операторға қолдау көрсеткені goto
. Алайда, бұл функция кейінірек жойылды. Себептердің бірі мынада: операторы бар code блоктары goto
бірдей функцияларды орындайтын, бірақ жоқ goto
, бірақ балама тәсілдермен ( break
, continue
, code блогын әдістерде орналастыру) орындалатын code блоктары сияқты оқылмайтын болды. Іс жүзінде басқалары болды, мысалы:
- операторларды қамтитын codeты оқу және түсіну қиындықтары
goto
; - компилятор үшін codeты оңтайландыруды қиындатады (кейде тіпті мүмкін емес);
- codeта нәзік қателер жасау ықтималдығын арттыру.
goto
Кейбір бағдарламалау тілдерінде оператор сәтті жұмыс істейтіні көпшілікке құпия емес . Дегенмен, бағдарламашылар оны пайдаланудан бас тартады. Мұның себептері туралы Хабредегі бір мақаладан оқи аласыз . Бірақ неге оны goto
сақталған сөздер тізімінде қалдыру керек? Бұл қарапайым: болашақ үшін. Егер, мысалы, айнымалылар, әдістер немесе сыныптар бүкіл әлем бойынша әзірлеушілердің Java codeында шақырылса, goto
бұл мәлімдеме Java-ның болашақ нұсқасында қайтарылса, барлық ескі code бұзылады. Мұндай сценарийді болдырмау үшін goto
ол Java кілт сөздерінің тізімінде қалады, бірақ ешқандай функционалдылықты қамтамасыз етпейді. Бәлкім, бір күні goto
ол біздің қатарымызға оралады, бірақ оның ықтималдығы төмен.
Нәтижелер
Біз Java тіліндегі әртүрлі секіру операторларын қарастырдық:return
— әдісті аяқтау, әдістен мәнді қайтару.- қайтарылатын мәнмен: мәндерді қайтаратын әдістер;
- қайтару мәні жоқ:
void
әдістер.
break
— циклдардың, коммутатор-кап блоктарының үзілуі.- тегтермен: әртүрлі ұя салу циклдері;
- жапсырмасыз: блоктың коммутаторлы тармақтары; ол шақырылған циклды үзу.
continue
.- тегтермен: әртүрлі ұя салу циклдері;
- белгілерсіз: ол шақырылған циклдің жалғасы.
goto
.- кілт сөздер тізімінде бар, бірақ пайдаланылмайды.
GO TO FULL VERSION