5-bo‘lim
Shartlar va switch
if va else, mantiqiy amallar, shartli operator, eski switch ko'rsatmasi, switch ifodasi va Java 21 dagi namuna moslashtirish.
Ushbu bo‘lim mundarijasi
Shartlar har qanday dasturning asosi. Java'da if oddiy, switch esa
so'nggi versiyalarda sezilarli kuchaygan.
if, else if, else #
public class Baho {
public static void main(String[] args) {
int ball = 87;
if (ball >= 90) {
System.out.println("A'lo");
} else if (ball >= 70) {
System.out.println("Yaxshi");
} else if (ball >= 60) {
System.out.println("Qoniqarli");
} else {
System.out.println("Qoniqarsiz");
}
}
}
Yaxshi
Java bitta ko'rsatma uchun { } ni talab qilmaydi:
if (ball >= 70)
System.out.println("Yaxshi");
Bu ishlaydi, lekin xavfli odat. Keyin ikkinchi qatorni qo'shsangiz, u shartdan tashqarida qoladi va buni sezish qiyin.
Bu mashhur xato: 2014-yilda Apple tizimidagi jiddiy xavfsizlik
zaifligi aynan qavssiz if dan keyin ikkinchi qator qo'shilgani
sababli yuzaga kelgan.
Har doim qavs qo'ying, hatto bitta qator bo'lsa ham.
Mantiqiy amallar #
public class Mantiq {
public static void main(String[] args) {
int yosh = 20;
boolean talabami = true;
System.out.println(yosh >= 18 && talabami);
System.out.println(yosh < 18 || talabami);
System.out.println(!talabami);
}
}
true
true
false
| Amal | Ma'nosi |
|---|---|
&& | VA - ikkalasi ham rost bo'lsa |
|| | YOKI - kamida bittasi rost bo'lsa |
! | EMAS - teskarisi |
&& va || qisqa tutashuv bilan ishlaydi: natija ma'lum
bo'lganda o'ng tomon umuman hisoblanmaydi.
public class Qisqa {
public static void main(String[] args) {
String ism = null;
if (ism != null && ism.length() > 3) {
System.out.println("Uzun ism");
} else {
System.out.println("Ism yo'q yoki qisqa");
}
}
}
Ism yo'q yoki qisqa
Birinchi shart yolg'on bo'lgani uchun ism.length() umuman
chaqirilmadi - aks holda dastur qulardi.
Java'da & va | ham bor, lekin ular ikkala tomonni ham
hisoblaydi. Shart tekshirishda deyarli har doim && va ||
ishlatiladi.
Shartli operator #
public class Uchlik {
public static void main(String[] args) {
int ball = 87;
String natija = ball >= 60 ? "o'tdi" : "o'tmadi";
System.out.println("Talaba " + natija);
int a = 15, b = 23;
System.out.println("Kattasi: " + (a > b ? a : b));
}
}
Talaba o'tdi
Kattasi: 23
Eski switch ko'rsatmasi #
public class EskiSwitch {
public static void main(String[] args) {
int kun = 3;
switch (kun) {
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("Ish kuni");
break;
case 6:
case 7:
System.out.println("Dam olish");
break;
default:
System.out.println("Noma'lum");
}
}
}
Ish kuni
break ni unutish - klassik xatoEski switch da har bir case dan keyin break yozilmasa, bajarilish
keyingi case'ga o'tib ketadi:
public class Otish {
public static void main(String[] args) {
int kun = 6;
switch (kun) {
case 6:
System.out.println("Shanba");
case 7:
System.out.println("Yakshanba");
default:
System.out.println("Tugadi");
}
}
}
Shanba
Yakshanba
Tugadi
Faqat "Shanba" kutilgan edi, lekin uchalasi ham chiqdi. Bunga fall-through deyiladi.
Ba'zan u ataylab ishlatiladi (yuqoridagi 1-5 kunlar kabi), lekin
ko'pincha bu shunchaki unutilgan break. Kompilyator ogohlantirmaydi.
Yechim - keyingi bo'limdagi yangi switch ifodasi: unda bu muammo
umuman yo'q.
switch ifodasi #
Java 14 dan switch qiymat qaytaradi va break talab qilmaydi:
public class YangiSwitch {
public static void main(String[] args) {
int kun = 3;
String nom = switch (kun) {
case 1 -> "Dushanba";
case 2 -> "Seshanba";
case 3 -> "Chorshanba";
case 4 -> "Payshanba";
case 5 -> "Juma";
case 6, 7 -> "Dam olish kuni";
default -> "Noma'lum";
};
System.out.println(nom);
}
}
Chorshanba
| Belgi | Ma'nosi |
|---|---|
-> | Shu holat uchun qaytariladigan qiymat |
case 6, 7 | Bir nechta qiymatni birlashtiradi |
default | Qolgan barcha holatlar |
Uchta sabab:
breakkerak emas - fall-through mumkin emas;- Qiymat qaytaradi - oraliq o'zgaruvchi yozish shart emas;
- To'liqlik tekshiriladi -
enumbilan ishlaganda barcha holat qamralmasa, kompilyator xato beradi.
Uchinchisi eng qimmatlisi: enum ga yangi qiymat qo'shsangiz,
kompilyator uni unutgan barcha switch larni ko'rsatib beradi.
Bir nechta ko'rsatma kerak bo'lsa yield ishlatiladi:
public class Yield {
public static void main(String[] args) {
int ball = 95;
String izoh = switch (ball / 10) {
case 10, 9 -> {
String asos = "A'lo";
yield asos + " (" + ball + " ball)";
}
case 8, 7 -> "Yaxshi";
default -> "Qoniqarli";
};
System.out.println(izoh);
}
}
A'lo (95 ball)
Namuna moslashtirish #
Java 21 dan switch turlarni ham tekshira oladi:
import java.math.BigDecimal;
public class Namuna {
public static void main(String[] args) {
Object[] narsalar = {
42, "salom", 3.14, true, 'A', new BigDecimal("1.5")
};
for (Object narsa : narsalar) {
String tavsif = switch (narsa) {
case Integer son -> "butun son: " + son;
case String matn -> "satr, uzunligi " + matn.length();
case Double kasr -> "kasr son: " + Math.round(kasr);
case Boolean mantiq -> "mantiqiy: " + mantiq;
case Character belgi -> "belgi: " + belgi;
default -> "boshqa tur: "
+ narsa.getClass().getSimpleName();
};
System.out.println(tavsif);
}
}
}
butun son: 42
satr, uzunligi 5
kasr son: 3
mantiqiy: true
belgi: A
boshqa tur: BigDecimal
Har bir holatda tur tekshirildi va qiymat mos turdagi o'zgaruvchiga yozildi - alohida aylantirish kerak bo'lmadi.
default qachon ishlaydiOxirgi qiymat - BigDecimal. Unga mos case yozilmagani uchun
default ishladi va tur nomini chiqardi.
Diqqat: getClass().getSimpleName() ni faqat nosozliklarni
qidirishda ishlating. Ba'zi turlarning haqiqiy sinf nomi yashirin
bo'ladi - masalan List.of(1, 2) uchun u ListN deb chiqadi, bu
esa JDK ning ichki tafsiloti va versiyaga qarab o'zgarishi mumkin.
Dastur mantiqini hech qachon sinf nomi matniga bog'lamang - switch
yoki instanceof bilan turning o'zini tekshiring.
Shart bilan namuna #
when qo'shib, namunaga qo'shimcha shart berish mumkin:
public class Shartli {
public static void main(String[] args) {
Object[] qiymatlar = {5, -3, 0, "uzun matn", "qisqa"};
for (Object q : qiymatlar) {
String natija = switch (q) {
case Integer son when son > 0 -> "musbat son: " + son;
case Integer son when son < 0 -> "manfiy son: " + son;
case Integer son -> "nol";
case String matn when matn.length() > 6 -> "uzun satr";
case String matn -> "qisqa satr: " + matn;
default -> "boshqa";
};
System.out.println(natija);
}
}
}
musbat son: 5
manfiy son: -3
nol
uzun satr
qisqa satr: qisqa
Namunalar yuqoridan pastga tekshiriladi va birinchi mos kelgani ishlaydi.
Yuqorida case Integer son ni eng yuqoriga qo'ysangiz, when li
holatlar hech qachon ishlamaydi - kompilyator buni sezadi va
"namuna kirib bo'lmas" degan xato beradi.
Qoida: eng tor shartni yuqoriga, eng kengini pastga.
instanceof bilan namuna #
switch dan tashqari if da ham namuna ishlatiladi:
public class Instanceof {
public static void main(String[] args) {
Object narsa = "Namangan";
// eski uslub
if (narsa instanceof String) {
String matn = (String) narsa;
System.out.println("Eski: " + matn.length());
}
// yangi uslub - Java 16 dan
if (narsa instanceof String matn) {
System.out.println("Yangi: " + matn.length());
}
if (narsa instanceof String m && m.startsWith("Nam")) {
System.out.println("Shart bilan: " + m);
}
}
}
Eski: 8
Yangi: 8
Shart bilan: Namangan
Yangi shakl tekshiradi va bir vaqtda o'zgaruvchiga yozadi - alohida aylantirish qatori kerak emas.
null bilan ehtiyot bo'ling #
public class NullSwitch {
public static void main(String[] args) {
String[] qiymatlar = {"ha", null};
for (String q : qiymatlar) {
String javob = switch (q) {
case null -> "qiymat berilmagan";
case "ha" -> "rozi";
case "yo'q" -> "rad etildi";
default -> "tushunarsiz";
};
System.out.println(javob);
}
}
}
rozi
qiymat berilmagan
null da qulaydiJava 21 gacha switch ga null bersangiz,
NullPointerException chiqardi - default ham yordam bermasdi.
Java 21 dan case null yozish mumkin bo'ldi. Lekin uni yozmasangiz,
eski xatti-harakat saqlanadi: null baribir istisno tashlaydi.
Ya'ni default sizni null dan himoya qilmaydi. Agar qiymat null
bo'lishi mumkin bo'lsa, case null ni oshkora yozing.
- Ball bo'yicha baho beruvchi
if/else ifzanjirini yozing. - Qavssiz
ifxatosini o'zingiz yaratib ko'ring. - Qisqa tutashuvni
nullmisolida tekshiring. - Eski
switchdabreakni olib tashlab, fall-through ni ko'ring. - Xuddi shu mantiqni yangi
switchifodasi bilan yozing. yieldbilan bir nechta ko'rsatmali holat yozing.Objectmassivi ustida tur namunalarini qo'llang.whenbilan musbat, manfiy va nolni ajrating.instanceofning eski va yangi shaklini solishtiring.switchganullberib,case nullsiz va u bilan sinab ko'ring.
Xulosa #
ifdan keyin har doim qavs qo'ying.&&va||qisqa tutashuv qiladi:nulltekshiruvini birinchi yozing.- Eski
switchdabreakunutilsa, bajarilish keyingi holatga o'tib ketadi. switchifodasi (->) qiymat qaytaradi,breaktalab qilmaydi vaenumuchun to'liqlikni tekshiradi.- Bir nechta ko'rsatma kerak bo'lsa
yield. - Java 21 dan
switchturlarni tekshira oladi;whenbilan qo'shimcha shart qo'yiladi. - Namunalar yuqoridan pastga tekshiriladi - eng tor shart yuqorida.
case nullni oshkora yozing;defaultnulldan himoya qilmaydi.
Keyingi bo'limda sikllarni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.