Сәлеметсіз бе! Өткен лекцияда біз Java тілінің ерекше жағдайлар сияқты аспектісімен таныстық және олармен жұмыс істеу мысалдарын көрдік. Бүгін біз олардың құрылымын тереңірек қарастырамыз, сонымен қатар өз ерекшеліктерімізді қалай жазу керектігін үйренеміз :)
Ерекшеліктер түрлері
Жоғарыда айтқанымыздай, Java-да 400-ге жуық ерекшелік кластары бар! Бірақ олардың барлығы топтарға бөлінген, сондықтан оларды есте сақтау өте оңай. Мынадай көрінеді: Барлық ерекшеліктердің ортақ ата класы барThrowable
. Одан екі үлкен топ шығады - ерекшеліктер (Ерекше) және қателер (Қате). Қате – Java виртуалды машинасының жұмысымен байланысты бағдарламаны орындау кезіндегі маңызды қате. Көп жағдайда Қатені өңдеу қажет емес, себебі ол codeтағы кейбір елеулі кемшіліктерді көрсетеді. Ең танымал қателер: StackOverflowError
- мысалы, әдіс өзін шексіз шақырғанда пайда болады және OutOfMemoryError
- жаңа an objectілерді құру үшін жады жеткіліксіз болғанда пайда болады. Көріп отырғаныңыздай, мұндай жағдайларда көбінесе өңдеуге ерекше ештеңе болмайды - code жай ғана қате жазылған және қайта өңдеуді қажет етеді. Ерекшеліктер , шын мәнінде, ерекшеліктер: бағдарлама жұмыс істеп тұрған кезде орын алған ерекше, жоспарланбаған жағдай. Бұл қателер сияқты маңызды қателер емес, бірақ олар біздің назарымызды қажет етеді. Барлық ерекшеліктер 2 түрге бөлінеді - тексерілген ( тексерілген ) және белгіленбеген ( белгіленбеген ). Барлық тексерілген ерекшеліктер ішінен келеді Exception
. «Тексерілетін» деген нені білдіреді? Біз бұл туралы соңғы дәрісте ішінара айттық : «...Java компиляторы ең жиі кездесетін ерекшеліктер туралы біледі және олардың қандай жағдайларда орын алуы мүмкін екенін біледі». Мысалы, ол біледі, егер бағдарламашы codeтағы файлдағы деректерді оқыса, файл жоқ деген жағдай оңай туындауы мүмкін. Ал оның алдын ала болжайтын мұндай жағдайлары өте көп. Сондықтан компилятор ықтимал ерекшеліктер үшін біздің codeты алдын ала тексереді. Егер ол оларды тапса, біз оларды өңдемейінше немесе жоғарыға жібермейінше, ол codeты құрастырмайды. Ерекшеліктің екінші түрі – «тексерілмеген». Олар сыныптан келеді RuntimeException
. Олардың сыналғандардан қандай айырмашылығы бар? RuntimeException
Белгілі бір орындалу уақытының ерекшеліктерін сипаттайтын және сипаттайтын әртүрлі сыныптардың тобы да бар сияқты . Айырмашылығы мынада, компилятор бұл қателерді күтпейді. Ол: «Кодты жазу кезінде мен күдікті ештеңе таппадым, бірақ ол жұмыс істеп тұрған кезде бірдеңе дұрыс болмады. Кодта қателер бар сияқты!» Және шынымен де солай. Тексерілмеген ерекшеліктер көбінесе бағдарламашы қателерінің нәтижесі болып табылады. Ал компилятор адамдар өз қолдарымен жасай алатын барлық ықтимал қате жағдайларды қамтамасыз ете алмайтыны анық :) Сондықтан ол біздің codeымызда мұндай ерекшеліктерді өңдеуді тексермейді. Бірнеше тексерілмеген ерекше жағдайларды кездестірдіңіз:
ArithmeticException
нөлге бөлгенде пайда боладыArrayIndexOutOfBoundsException
Жиымнан тыс ұяшыққа кіру әрекеті кезінде пайда болады.
Ерекшелікті қалай тастауға болады
Әрине, Java-ны жасаушылар бағдарламаларда туындауы мүмкін барлық ерекше жағдайларды қамтамасыз ете алмайды. Әлемде тым көп бағдарламалар бар және олар тым әртүрлі. Бірақ бұл жақсы, өйткені қажет болған жағдайда өзіңіздің ерекше жағдайларыңызды жасай аласыз. Бұл өте оңай жасалады. Сізге тек өз класыңызды құру жеткілікті. Оның атауы «Ерекше» дегенмен аяқталуы керек. Бұл компиляторға қажет емес, бірақ сіздің codeыңызды оқитын бағдарламашылар бұл ерекшелік класы екенін бірден түсінеді. Бұған қоса, сыныптың сыныптан шыққанын көрсету керекException
. Бұл компилятор және дұрыс жұмыс істеу үшін қажет. Мысалы, бізде Dog класы бар - Dog
. көмегімен итпен серуендеуге болады walk()
. Бірақ бұған дейін біздің үй жануарымыздың жағасы, қарғыбауы және тұмсығы бар-жоғын тексеру керек. Егер олардың кез келгені жоқ болса, біз өз ерекшелікімізді шығарамыз DogIsNotReadyException
. Оның codeы келесідей болады:
public class DogIsNotReadyException extends Exception {
public DogIsNotReadyException(String message) {
super(message);
}
}
Класс ерекшелік екенін көрсету үшін сынып атауынан кейін Exception кеңейтімін жазу керек : бұл «сынып Exception сыныбынан шыққан» дегенді білдіреді. Конструкторда біз жай ғана класс конструкторын Exception
сызықпен шақырамыз message
- ол пайдаланушыға жүйеден орын алған қатені сипаттайтын хабарламаны көрсетеді. Бұл біздің сынып codeымызда келесідей болады:
public class Dog {
String name;
boolean isCollarPutOn;
boolean isLeashPutOn;
boolean isMuzzlePutOn;
public Dog(String name) {
this.name = name;
}
public static void main(String[] args) {
}
public void putCollar() {
System.out.println("The collar is on!");
this.isCollarPutOn = true;
}
public void putLeash() {
System.out.println("The leash is on!");
this.isLeashPutOn = true;
}
public void putMuzzle() {
System.out.println("The muzzle is on!");
this.isMuzzlePutOn = true;
}
public void walk() throws DogIsNotReadyException {
System.out.println("Let's go for a walk!");
if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
System.out.println("Hurrah, let's go for a walk!" + name + " I am glad!");
} else {
throw new DogIsNotReadyException("Dog " + name + "not ready for a walk! Check your gear!");
}
}
}
Енді біздің әдіс walk()
ерекше жағдайды шығарады DogIsNotReadyException
. Бұл кілт сөздің көмегімен жасалады throw
. Жоғарыда айтқанымыздай, ерекшелік an object болып табылады. Сондықтан, біздің әдісімізде ерекше жағдай орын алғанда - итке бірдеңе жетіспейді - біз жаңа класс an objectісін жасап DogIsNotReadyException
, оны сөзді пайдаланып бағдарламаға тастаймыз throw
. walk()
Біз әдіс қолтаңбасына лақтыруларды қосамыз DogIsNotReadyException
. Басқаша айтқанда, компилятор енді әдіс шақыруы walk()
ерекше жағдайға әкелуі мүмкін екенін біледі. Сондықтан біз оны бағдарламаның бір жерінде шақырған кезде, ерекше жағдайды өңдеу қажет болады. Мұны әдісте жасауға тырысайық main()
:
public static void main(String[] args) {
Dog dog = new Dog("Mukhtar");
dog.putCollar();
dog.putMuzzle();
dog.walk();//Unhandled exception: DogIsNotReadyException
}
Компиляция жасамайды, ерекшелік өңделмейді! try-catch
Ерекше жағдайды өңдеу үшін codeты блокқа орап көрейік :
public static void main(String[] args) {
Dog dog = new Dog("Mukhtar");
dog.putCollar();
dog.putMuzzle();
try {
dog.walk();
} catch (DogIsNotReadyException e) {
System.out.println(e.getMessage());
System.out.println("Checking equipment! Is the collar on?" + dog.isCollarPutOn + "\r\n Is the leash on?"
+ dog.isLeashPutOn + "\r\n Are you wearing a muzzle?" + dog.isMuzzlePutOn);
}
}
Енді консоль шығысын қарастырайық:
Ошейник надет!
Намордник надет!
Собираемся на прогулку!
Собака Мухтар не готова к прогулке! Проверьте экипировку!
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false
Намордник надет? true
Консоль шығысы қаншалықты ақпараттандырылғанын қараңыз! Біз бағдарламада болған әрбір қадамды көреміз; Біз қатенің қай жерде болғанын көреміз және біздің итімізге не жетіспейтінін бірден байқаймыз :) Осылайша біз өз ерекшеліктерімізді жасаймыз. Көріп отырғаныңыздай, күрделі ештеңе жоқ. Java әзірлеушілері дұрыс жабдықталмаған иттер үшін өз тіліне ерекше ерекшелік қосуға алаңдамаса да, біз олардың қадағалауын түзеттік :)
GO TO FULL VERSION