Күнделікті өмірде кейде біз жоспарламаған жағдайлар туындайды. Мысалы, сіз таңертең жұмысқа тұрасыз, телефоныңызға зарядтағышты іздейсіз, бірақ ол жоқ. Сіз ваннаға бетіңізді жууға барасыз - су өшірілді. Мен көлікке отырдым, ол іске қосылмады. Бірақ адам мұндай күтпеген жағдайларды оңай жеңе алады. Біз осы мақалада Java бағдарламалары олармен қалай жұмыс істейтінін анықтауға тырысамыз.
Қандай ерекшеліктер java
Бағдарламалау әлемінде бағдарламаны орындау кезінде қателер мен күтпеген жағдайлардың пайда болуы ерекше жағдай деп аталады. Бағдарламада ерекше жағдайлар пайдаланушының қате әрекеттері, дискіде қажетті ресурстың болмауы немесе желі арқылы serverге қосылуды жоғалту нәтижесінде пайда болуы мүмкін. Бағдарламаны орындау кезіндегі ерекшеліктер бағдарламалау қателерінен немесе API дұрыс пайдаланбауынан да туындауы мүмкін. Біздің әлемнен айырмашылығы, бағдарлама мұндай жағдайда не істеу керектігін анық білуі керек. Java осы мақсат үшін ерекшелік механизмін ұсынады.
Кілт сөздер туралы қысқаша try, catch, endly, throws
Java тілінде ерекше жағдайларды өңдеу бағдарламада келесі кілт сөздерді пайдалануға негізделген:
- try - ерекше жағдай орын алуы мүмкін code блогын анықтайды;
- catch – ерекше жағдай өңделетін code блогын анықтайды;
- ақырында – міндетті емес, бірақ бар болса, try блогының нәтижелеріне қарамастан бәрібір орындалатын code блогын анықтайды.
Бұл кілт сөздер бағдарлама codeында арнайы өңдеу құрылымдарын жасау үшін пайдаланылады: try{}catch, try{}catch{}finally, try{}finally{}.
- throw – ерекше жағдайды көтеру үшін қолданылады;
- throws – әдіс ерекше жағдайды шығаруы мүмкін екенін ескерту үшін әдіс қолтаңбаларында қолданылады.
Java бағдарламасында кілт сөздерді пайдалану мысалы:
public String input() throws MyException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = null;
try {
s = reader.readLine();
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
reader.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
if (s.equals("")) {
throw new MyException("String can not be empty!");
}
return s;
}
Неліктен бізге ерекшелік механизмі қажет?
Нақты әлемдік мысалды қарастырайық. Елестетіп көріңізші, трассада жүк көтергіштігі шектеулі апаттық көпір бар учаске бар. Массасы көпірдің жүк көтергіштігінен асатын көлік оның үстінен өтіп кетсе, ол опырылып, жүргізушінің жағдайы, жұмсақ тілмен айтқанда, ерекше болуы мүмкін. Бұған жол бермеу үшін жол қызметі жолға алдын ала ескерту белгілерін орнатады. Көлік жүргізушісі ескерту белгісіне қарап, өз көлігінің салмағын көпірде жүруге рұқсат етілген салмақпен салыстырады. Одан асып кетсе, айналма жолмен жүреді. Жол қызметінің әрекетінің арқасында жүк көлігі жүргізушілеріне, біріншіден, бағытын алдын ала өзгертуге мүмкіндік берілді, екіншіден, негізгі бағыттағы қауіп туралы ескертілді, ең соңында, пайдалану мүмкін еместігі туралы ескертілді. көпір белгілі бір жағдайларда.
Бағдарламадағы ерекше жағдайды болдырмау және оны жалғастыру үшін шешу мүмкіндігі Java тілінде ерекше жағдайларды пайдалану себептерінің бірі болып табылады. Ерекшелік механизмі сонымен қатар кіріс деректерді тексеру (тексеру) арқылы сіз жазған codeты (бағдарламалау интерфейсі) пайдаланушының теріс пайдалануынан қорғауға мүмкіндік береді. Енді бір сәт жол полициясы болайық. Біріншіден, сіз көлік жүргізушілерінің қиындықтарға тап болатын жерлерін білуіңіз керек. Екіншіден, ескерту белгілерін дайындап, орнату керек. Ақырында, негізгі бағытта қауіп төнген жағдайда айналма жолдарды қамтамасыз ету керек. Java тілінде ерекшелік механизмі ұқсас жұмыс істейді. Бағдарламаны әзірлеу сатысында try{} блогы арқылы codeтың қауіпті бөлімдерін ерекше жағдайлардан «қорғаймыз», catch{} блогын пайдаланып «сақтық көшірме» жолдарын қамтамасыз етеміз және соңында{} блогында орындалатын codeты жазамыз. кез келген нәтижеге арналған бағдарлама. «Төтенше жағдайды» қамтамасыз ете алмасақ немесе таңдауды пайдаланушыға әдейі қалдырғымыз келсе, біз оны кем дегенде қауіп туралы ескертуіміз керек. Неліктен? Жол бойында бірде-бір ескерту белгісін таппай өтпейтін апатты көпірге жеткен жүргізушінің ашуын елестетіп көріңізші! Бағдарламалауда, біздің сыныптар мен әдістерді жазғанда, біз әрқашан олардың бағдарламаларында басқа әзірлеушілердің пайдалану контекстін болжай алмаймыз, сондықтан біз ерекше жағдайды шешудің 100% дұрыс жолын болжай алмаймыз. Сонымен қатар, codeымызды пайдаланушыларды ерекше жағдайдың болуы туралы ескерту жақсы тәжірибе болып табылады. Java-ның ерекшелік механизмі мұны throws арқылы орындауға мүмкіндік береді — негізінен ерекше жағдайды шығару әдісіміздің жалпы әрекетін жариялайды, осылайша Java-дағы ерекше жағдайды өңдеу үшін code жазу әдісін пайдаланушыға қалдырады.
«Ақаулық» туралы ескерту
Әдісіңізде ерекше жағдайды өңдеуді жоспарламасаңыз, бірақ пайдаланушыларды ықтимал ерекше жағдайлар туралы әдіс туралы ескерткіңіз келсе, throws кілт сөзін пайдаланыңыз. Әдіс қолтаңбасындағы бұл кілт сөз белгілі бір жағдайларда әдіс ерекше жағдайды шығаруы мүмкін дегенді білдіреді. Бұл ескерту әдіс интерфейсінің бөлігі болып табылады және пайдаланушыға ерекше жағдай өңдеушісінің орындалуын теңшеу құқығын береді. Лақтырғаннан кейін біз лақтырылатын ерекшелік түрін көрсетеміз. Бұл әдетте Java
Exception класының ұрпақтары . Java нысанға бағытталған тіл болғандықтан, Java тіліндегі барлық ерекшеліктер нысандар болып табылады.
Java ерекшелік иерархиясы
Бағдарламаны орындау кезінде қате орын алған кезде, JVM орындалу уақыты Java ерекшелік иерархиясынан қажетті түрдегі нысанды жасайды - ортақ «атадан» мұраланған ықтимал ерекшеліктер жиынтығы - Throwable класы. Бағдарламада орын алатын ерекше жағдайларды екі топқа бөлуге болады:
- Бағдарламаның одан әрі қалыпты жұмысын қалпына келтіру мүмкін емес жағдайлар
- Қалпына келтіру мүмкін.
Бірінші топқа
Error сыныбынан мұраланған ерекшеліктер орын алатын жағдайлар кіреді . Бұл JVM қатесі, жадтың толып кетуі немесе жүйенің бұзылуы нәтижесінде бағдарламаны орындау кезінде пайда болатын қателер. Олар әдетте бағдарламалық жасақтаманы пайдалану арқылы түзетілмейтін күрделі мәселелерді көрсетеді. Java тіліндегі ерекше жағдайдың бұл түрі компиляция сатысында белгіленбеген ретінде жіктеледі. Бұл топқа сонымен қатар RuntimeException кіреді - ерекше жағдайлар, бағдарламаны орындау кезінде JVM арқылы жасалған
Exception класының мұрагерлері. Олар көбінесе бағдарламалау қателерінен туындайды. Бұл ерекшеліктер компиляция уақытында да тексерілмейді, сондықтан оларды өңдеу үшін code жазу қажет емес. Екінші топқа бағдарламаны жазу кезеңінде болжанатын және өңдеу codeы жазылуы тиіс ерекше жағдайлар жатады. Мұндай ерекшеліктер тексеріледі. Ерекшеліктермен айналысу кезінде Java әзірлеушісінің жұмысының негізгі бөлігі осындай жағдайларды өңдеу болып табылады.
Ерекше жағдай жасау
Бағдарламаны орындау кезінде ерекше жағдай JVM арқылы немесе
throw операторы арқылы қолмен шығарылады . Бұл жадта ерекше жағдай нысанын жасайды және JVM ерекшелік өңдеушісі ерекше жағдайды өңдеу жолын табуға тырысқан кезде негізгі бағдарлама codeының орындалуын тоқтатады.
Ерекше жағдайды өңдеу
Біз Java тілінде ерекше жағдайларды өңдеуді қамтамасыз ететін code блоктарын жасау try{}catch, try{}catch{}finally, try{}finally{} конструкцияларын қолдану арқылы бағдарламада орындалады.
Ерекшелік try блогында көтерілгенде, ерекше жағдай өңдегіші келесі catch блогында ізделеді. Егер аулау осы түрдегі ерекшелік үшін өңдегішті қамтыса, басқару оған өтеді. Әйтпесе, JVM қолайлы аулау табылмайынша, әдіс шақыруларының тізбегінен осы ерекшелік түріне арналған өңдеушіні іздейді. catch блогы орындалғаннан кейін басқару қосымша
finally блогына беріледі . Сәйкес ұстау блогы табылмаса, JVM бағдарламаның орындалуын тоқтатады және егер бар болса, соңғы блок codeын бұрын орындаған
sck trace әдіс шақыруларының сағын көрсетеді. Ерекше жағдайды өңдеу мысалы:
public class Print {
void print(String s) {
if (s == null) {
throw new NullPointerException("Exception: s is null!");
}
System.out.println("Inside method print: " + s);
}
public static void main(String[] args) {
Print print = new Print();
List list= Arrays.asList("first step", null, "second step");
for (String s:list) {
try {
print.print(s);
}
catch (NullPointerException e) {
System.out.println(e.getMessage());
System.out.println("Exception was processed. Program continues");
}
finally {
System.out.println("Inside bloсk finally");
}
System.out.println("Go program....");
System.out.println("-----------------");
}
}
}
Негізгі әдістің нәтижелері :
Inside method print: first step
Inside bloсk finally
Go program....
-----------------
Exception: s is null!
Exception was processed. Program continues
Inside bloсk finally
Go program....
-----------------
Inside method print: second step
Inside bloсk finally
Go program....
-----------------
Блок
finally
әдетте try блогында ашылған ағындарды жабу немесе ресурстарды босату үшін пайдаланылады. Дегенмен, бағдарламаны жазу кезінде барлық ресурстардың жабылуын бақылау әрқашан мүмкін емес. Біздің өмірімізді жеңілдету үшін Java әзірлеушілері бізге
try-with-resources
сынақ блогында ашылған ресурстарды автоматты түрде жабатын құрылымды ұсынды. Біздің бірінші мысалды келесідей қайта жазуға болады
try-with-resources
:
public String input() throws MyException {
String s = null;
try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
s = reader.readLine();
} catch (IOException e) {
System.out.println(e.getMessage());
}
if (s.equals("")){
throw new MyException ("String can not be empty!");
}
return s;
}
7-нұсқадан бастап Java мүмкіндіктерінің арқасында біз codeты ықшам әрі оқылатын етіп жасай отырып, бір блокта әртүрлі ерекшеліктерді ұстауды біріктіре аламыз. Мысалы:
public String input() {
String s = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
s = reader.readLine();
if (s.equals("")) {
throw new MyException("String can not be empty!");
}
} catch (IOException | MyException e) {
System.out.println(e.getMessage());
}
return s;
}
Нәтижелер
Java-дағы ерекше жағдайларды пайдалану «сақтық көшірме» жолдарын пайдалану арқылы бағдарламаның ақауларға төзімділігін арттыруға, catch блоктарын пайдалану арқылы негізгі codeтың логикасын ерекшеліктерді өңдеу codeынан бөлуге мүмкіндік береді, сонымен қатар бізге өкілеттік беру мүмкіндігін береді. throws көмегімен codeты пайдаланушыға ерекше жағдайды өңдеу.
GO TO FULL VERSION