این بخش دستورات تصمیمگیری، حلقهها و انشعاب پشتیبانیشده توسط زبان جاوا را توضیح میدهد.
دستور if-then پایهایترین دستور کنترل جریان است. به برنامه شما میگوید بخش خاصی از کد فقط اگر آزمون خاصی true باشد اجرا شود. به عنوان مثال، کلاس Bicycle میتواند اجازه دهد ترمزها فقط زمانی سرعت دوچرخه را کاهش دهند که دوچرخه در حال حرکت باشد. یک پیادهسازی ممکن از متد applyBrakes() میتواند به صورت زیر باشد:
اگر این آزمون false باشد (به این معنی که دوچرخه در حال حرکت نیست)، کنترل به انتهای دستور if-then میرود.
علاوه بر این، آکولادهای باز و بسته اختیاری هستند، به شرطی که عبارت "then" فقط شامل یک دستور باشد:
تصمیمگیری در مورد اینکه آکولادها را حذف کنید یا نه، به سلیقه شخصی بستگی دارد. حذف آنها میتواند کد را شکنندهتر کند. اگر بعداً دستور دیگری به عبارت "then" اضافه شود، خطای رایج فراموش کردن اضافه کردن آکولادهای جدید است. کامپایلر نمیتواند این نوع خطا را شناسایی کند؛ فقط نتایج نادرست دریافت خواهید کرد.
دستور if-then-else مسیر اجرای ثانویهای را فراهم میکند وقتی عبارت "if" false باشد. میتوانید از دستور if-then-else در متد applyBrakes() استفاده کنید تا در صورت اعمال ترمز وقتی دوچرخه در حال حرکت نیست، اقدامی انجام دهید. در این حالت، اقدام فقط چاپ یک پیام خطا است که بیان میکند دوچرخه قبلاً متوقف شده است.
برنامه زیر، IfElseDemo، بر اساس مقدار نمره آزمون یک درجه اختصاص میدهد: A برای نمره ۹۰٪ یا بالاتر، B برای نمره ۸۰٪ یا بالاتر، و الی آخر:
class IfElseDemo {
public static void main(String[] args) {
int testscore = 76;
char grade;
if (testscore >= 90) {
grade = 'A';
} else if (testscore >= 80) {
grade = 'B';
} else if (testscore >= 70) {
grade = 'C';
} else if (testscore >= 60) {
grade = 'D';
} else {
grade = 'F';
}
IO.println("Grade = " + grade);
}
}
خروجی برنامه:
Grade = C
ممکن است متوجه شده باشید که مقدار testscore میتواند بیش از یک عبارت در دستور مرکب را راضی کند: 76 >= 70 و 76 >= 60. اما، وقتی یک شرط برآورده شد، دستورات مناسب اجرا میشوند (grade = 'C';) و شروط باقیمانده ارزیابی نمیشوند.
دستور while بهطور مداوم بلوکی از دستورات را تا زمانی که شرط خاصی true است اجرا میکند. نحو آن به صورت زیر بیان میشود:
while (expression) {
statement(s)
}
دستور while عبارت را ارزیابی میکند که باید مقدار boolean برگرداند. اگر عبارت true باشد، دستور while دستور(ها) موجود در بلوک while را اجرا میکند. دستور while بهطور مداوم عبارت را آزمایش و بلوکش را اجرا میکند تا زمانی که عبارت false شود. استفاده از دستور while برای چاپ مقادیر از ۱ تا ۱۰ به صورت زیر انجام میشود:
class WhileDemo {
public static void main(String[] args) {
int count = 1;
while (count <= 10) {
IO.println("Count is: " + count);
count++;
}
}
}
میتوانید حلقه بینهایت با دستور while به صورت زیر پیادهسازی کنید:
while (true) {
// statement(s)
}
زبان جاوا دستور do-while را نیز فراهم میکند که به صورت زیر بیان میشود:
do {
statement(s)
} while (expression);
تفاوت بین do-while و while این است که do-while عبارتش را در پایین حلقه به جای بالا ارزیابی میکند. بنابراین، دستورات داخل بلوک do همیشه حداقل یک بار اجرا میشوند، همانطور که در برنامه زیر نشان داده شده است:
class DoWhileDemo {
public static void main(String[] args) {
int count = 1;
do {
IO.println("Count is: " + count);
count++;
} while (count <= 10);
}
}
دستور for راهی فشرده و مختصر برای تکرار روی محدودهای از مقادیر فراهم میکند. برنامهنویسان اغلب به آن «حلقه for» میگویند. فرم کلی دستور for به صورت زیر بیان میشود:
for (initialization; termination; increment) {
statement(s)
}
هنگام استفاده از این نسخه از دستور for، این نکات را در نظر داشته باشید:
false شد، حلقه خاتمه مییابد.برنامه زیر، ForDemo، از فرم کلی دستور for برای چاپ اعداد ۱ تا ۱۰ استفاده میکند:
class ForDemo {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
IO.println("Count is: " + i);
}
}
}
خروجی این برنامه:
Count is: 1
Count is: 2
Count is: 3
...
Count is: 10
توجه کنید چگونه کد متغیری را در عبارت initialization اعلام میکند. دامنه این متغیر از محل اعلام آن تا انتهای بلوک تحت کنترل دستور for است، بنابراین میتوان آن را در عبارات termination و increment نیز استفاده کرد. اگر متغیری که حلقه for را کنترل میکند خارج از حلقه مورد نیاز نیست، بهتر است آن را در عبارت initialization اعلام کنید. نامهای i، j و k اغلب برای کنترل حلقههای for استفاده میشوند؛ اعلام آنها در عبارت initialization عمر مفیدشان را محدود و خطاها را کاهش میدهد.
سه عبارت حلقه for اختیاری هستند؛ حلقه بینهایت به صورت زیر قابل ایجاد است:
for (;;) {
// statement(s)
}
دستور for همچنین فرم دیگری برای تکرار روی Collections و آرایهها دارد. این فرم گاهی دستور enhanced for نامیده میشود و میتواند حلقههای شما را فشردهتر و خواناتر کند. به عنوان نمونه، آرایه زیر را در نظر بگیرید که اعداد ۱ تا ۱۰ را نگه میدارد:
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
برنامه زیر، EnhancedForDemo، از enhanced for برای حلقه روی آرایه استفاده میکند:
class EnhancedForDemo {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int item : numbers) {
IO.println("Count is: " + item);
}
}
}
در این مثال، متغیر item مقدار فعلی از آرایه numbers را نگه میدارد. خروجی این برنامه مانند قبل است.
توصیه میشود از فرم enhanced for دستور for به جای فرم کلی هر زمان که ممکن است استفاده کنید.
دستور break دو فرم دارد: با برچسب و بدون برچسب. شما فرم بدون برچسب را در بحث قبلی درباره دستور switch دیدهاید. همچنین میتوانید از break بدون برچسب برای خاتمه دادن به حلقه for، while یا do-while استفاده کنید، همانطور که در برنامه زیر نشان داده شده است:
class BreakDemo {
public static void main(String[] args) {
int[] arrayOfInts = {32, 87, 3, 589, 12, 1076, 200, 7500, 42, 7};
int searchfor = 12;
int i;
boolean foundIt = false;
for (i = 0; i < arrayOfInts.length; i++) {
if (arrayOfInts[i] == searchfor) {
foundIt = true;
break;
}
}
if (foundIt) {
IO.println("Found " + searchfor + " in the array");
} else {
IO.println(searchfor + " not in the array");
}
}
}
این برنامه عدد ۱۲ را در آرایه جستجو میکند. دستور break وقتی آن مقدار پیدا شد، حلقه for را خاتمه میدهد. سپس جریان اجرا به دستور بعد از حلقه for منتقل میشود. خروجی این برنامه:
Found 12 in the array
یک دستور break بدون برچسب نزدیکترین دستور switch، for، while یا do-while را خاتمه میدهد، اما break با برچسب دستور بیرونی را خاتمه میدهد. برنامه زیر، BreakWithLabelDemo، مشابه برنامه قبلی است اما از حلقههای تو در توی for برای جستجوی مقداری در آرایه دوبعدی استفاده میکند. وقتی مقدار پیدا شد، break با برچسب حلقه بیرونی for (با برچسب "search") را خاتمه میدهد:
class BreakWithLabelDemo {
public static void main(String[] args) {
int[][] arrayOfInts = {
{32, 87, 3, 589},
{12, 1076, 200, 7500},
{42, 7}
};
int searchfor = 12;
int i;
int j = 0;
boolean foundIt = false;
search:
for (i = 0; i < arrayOfInts.length; i++) {
for (j = 0; j < arrayOfInts[i].length; j++) {
if (arrayOfInts[i][j] == searchfor) {
foundIt = true;
break search;
}
}
}
if (foundIt) {
IO.println("Found " + searchfor + " at [" + i + "][" + j + "]");
} else {
IO.println(searchfor + " not in the array");
}
}
}
خروجی این برنامه:
Found 12 at [1][0]
دستور break دستور با برچسب را خاتمه میدهد؛ جریان کنترل را به برچسب منتقل نمیکند. جریان کنترل به دستوری که بلافاصله بعد از دستور با برچسب (خاتمهیافته) قرار دارد منتقل میشود.
دستور continue تکرار فعلی حلقه for، while یا do-while را رد میکند. فرم بدون برچسب به انتهای بدنه نزدیکترین حلقه میرود و عبارت boolean کنترلکننده حلقه را ارزیابی میکند. برنامه زیر، ContinueDemo، از یک String عبور میکند و تعداد حروف p را میشمارد. اگر کاراکتر فعلی p نباشد، دستور continue بقیه حلقه را رد کرده و به کاراکتر بعدی میرود. اگر p باشد، برنامه شمارنده حرف را افزایش میدهد:
class ContinueDemo {
public static void main(String[] args) {
String searchMe = "peter piper picked a peck of pickled peppers";
int max = searchMe.length();
int numPs = 0;
for (int i = 0; i < max; i++) {
if (searchMe.charAt(i) != 'p')
continue;
numPs++;
}
IO.println("The letter 'p' appears " + numPs + " times.");
}
}
خروجی این برنامه:
The letter 'p' appears 9 times.
برای دیدن واضحتر این اثر، سعی کنید دستور continue را حذف و دوباره کامپایل کنید. وقتی برنامه را دوباره اجرا کنید، شمارش نادرست خواهد بود و ۳۵ تا p به جای ۹ نشان میدهد.
دستور continue با برچسب تکرار فعلی حلقه بیرونی که با برچسب مشخص شده را رد میکند. برنامه زیر از حلقههای تو در تو استفاده میکند تا زیررشتهای را در رشته دیگری جستجو کند. دو حلقه تو در تو مورد نیاز است: یکی برای تکرار روی زیررشته و دیگری برای تکرار روی رشتهای که در آن جستجو میشود. برنامه زیر از continue با برچسب test برای رد کردن یک تکرار در حلقه بیرونی استفاده میکند:
class ContinueWithLabelDemo {
public static void main(String[] args) {
String searchMe = "Look for a nested Go within a string";
String substr = "Go";
int max = searchMe.length() - substr.length() + 1;
int numFound = 0;
test:
for (int i = 0; i <= max; i++) {
int n = substr.length();
int j = i;
while (n-- > 0) {
if (searchMe.charAt(j++) != substr.charAt(0))
continue test;
}
numFound++;
}
IO.println("Found " + numFound + " substring(s)");
}
}
خروجی این برنامه:
Found 1 substring(s)
دستور انشعابی بعدی دستور return است. دستور return از متد فعلی خارج میشود و جریان اجرا به محل فراخوانی متد برمیگردد. دستور return دو فرم دارد: یکی که مقداری برمیگرداند و دیگری که مقداری برنمیگرداند. برای برگرداندن مقدار، بهسادگی مقدار (یا عبارتی که مقدار را محاسبه میکند) را بعد از کلیدواژه return قرار دهید:
return expression;
نوع داده مقدار برگشتی باید با نوع مقدار return اعلامشده متد مطابقت داشته باشد. وقتی متد void اعلام شده است، از فرم return بدون مقدار استفاده کنید:
return;
بخش کلاسها و اشیا همه چیزهایی که برای نوشتن متدها نیاز دارید را پوشش میدهد.
دستور انشعابی آخر دستور yield است. دستور yield از عبارت switch فعلی که در آن قرار دارد خارج میشود. دستور yield همیشه با عبارتی که باید مقداری تولید کند دنبال میشود. این عبارت نمیتواند void باشد. مقدار این عبارت همان مقداری است که توسط عبارت switch محصورکننده تولید میشود.
در اینجا نمونهای از دستور yield آورده شده است:
int result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 0;
default -> {
int remainingWorkDays = 5 - d.ordinal();
yield remainingWorkDays;
}
};این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/