JavaRush /Блоги Java /Random-TG /Истисноҳо дар Java
Roman
Сатҳи

Истисноҳо дар Java

Дар гурӯҳ нашр шудааст
Вақте ки ман ба мавзӯи "Истисноҳо" дучор шудам, саволҳои зиёде пайдо шуданд, ки ман маҷбур шудам, ки ба онҳо дар гӯшаҳои гуногуни Интернет ҷавоб ҷӯям, то ба таври муфассал фаҳмам, ки ин ҳама чӣ гуна кор мекунад. Дар натиҷа, ман шарҳи шахсии худро тартиб додам, ки шояд барои шурӯъкунандагоне, ки бо ин падида дучор омадаанд, фаҳмотар бошад. Истисноҳо дар Java - 1Дар компютерҳо, таваққуф сигнали воридотӣ ба протсессор дар бораи рух додани ҳодисаест, ки вокуниши фаврӣ талаб мекунад. Сигнали қатъшавӣ аз протсессор талаб мекунад, ки барномаи иҷрошавандаро таваққуф кунад, то он каме дертар идома ёбад, яъне компютер бояд тамоми информатсияи марбут ба иҷрои барномаро дар хотир нигоҳ дорад. Чунин қатъшавӣ муваққатӣ аст, агар марговар набошад. Чунин таваққуфҳо метавонанд ё аз codeи барнома ё баъзе функсияҳои сахтафзор (масалан, танҳо пахш кардани тугмаҳо дар клавиатура; таймерҳо, масалан, барои худкор хомӯш кардани компютер) ба вуҷуд оянд. Миқдори Танаффусҳо бо шумораи муайяне маҳдуд аст, ки дар истеҳсоли протсессори мушаххас сохта шудааст, яъне барои ин "каналҳо"-и махсуси иртиботӣ ҷудо карда шудаанд, ки ба шумо имкон медиҳанд, ки ба протсессор бо гузашти ҳама равандҳои дигар дастрасӣ пайдо кунед. Танаффусҳо инчунин ҳангоми ба амал омадани хато дар codeи барномаи иҷрошаванда ба таври худкор тавлид мешаванд (масалан, агар тақсимшавӣ ба сифр рух диҳад). Чунин таваққуфҳоро ба таври анъанавӣ домҳо ё истисноҳо меноманд . Дар чунин мавридҳо маъмулан мегӯянд: «Истисно партофта шуд», яъне Истисно ба кор андохта шуд ё Истисно партофта шуд (партофт), яъне дархост барои Танаффусбо саволи "чӣ бояд кард?" ба протсессор фиристода мешавад. Дар айни замон, протсессор корашро қатъ мекунад ва нуқтаи дар он қатъшударо ба ёд меорад, дурусттараш кластери ячейкаи навбатӣ, ки иттилоот бояд аз он иҷро карда шавад. Тамоми силсилаи дастурҳои иҷрошуда ва НЕСТ дар хотир нигоҳ дошта мешаванд. Пас аз он, протсессор дастурҳоро аз хотира барои амал дар сурати рух додани чунин хато мехонад. Мутобиқи ин дастур, он метавонад ба кластерҳои муайян арзишҳои нав ворид кунад, баъзе занҷирҳои амалҳо ё давраи нав (масалан, гардиш ё гардиш) ва ғайра илова кунад, яъне вобаста ба хатогии қаблан гузошташуда. дастурҳои поён иҷро мешаванд. Худи системаи компютерӣ бисёр Танаффусҳои автоматии дар дохor он сохташуда дорад, ки пас аз вақти муайян ба кор андохта мешаванд, масалан, барои идоракунии равандҳои дар компютер иҷрошаванда ё ба кор андохтани сигналҳои муқарраршуда, ҷамъоварии сигналҳои берунии воридотӣ ва табдилдиҳандаҳои гуногуни маълумот. Бояд дар хотир дошт, ки шумораи зиёди Танаффусҳо бо як қатор сабабҳо метавонанд системаро комилан «овезон» кунанд. Хатогӣ дар codeи барнома ба таври худкор халалдор шудани протсессорро ба вуҷуд меорад, ки он кӯшиш мекунад, ки мувофиқи дастурҳои муқарраршуда коркард кунад. Аммо на ҳама танаффусҳо барои коркарди онҳо тарҳрезӣ шудаанд, ё он метавонад тартиберо ба вуҷуд орад, ки ба мо мувофиқат намекунад, масалан, он танҳо барномаро вайрон мекунад. Аз ин рӯ, дар барномасозӣ, имкон дорад, ки фосилаи шахсии худро барои як қисми муайяни code ташкил кунед, ки дар он барномасоз эҳтимолияти хатогиро мебинад. Дар ин ҳолат, хато дар дохor барнома коркард карда мешавад ва барои коркарди дастурҳо бо протсессор тамос нахоҳад гирифт. Таърифи чунин блокҳо тавассути эҷоди an objectи "Истисно" ташкил карда мешавад . Ин an object ба таври худкор дар блок сохта мешавад try-catch. Блок >tryбарои мавҷудияти хато тафтиш карда мешавад ва агар мавҷуд бошад, барнома ба блок меравад catch, ки дар он ҷо барои пешгирӣ ё сатҳи хато чораҳо андешида мешаванд. Масалан, агар мо Рақамҳоро аз клавиатура ворид кунем , ки баъдан онҳо бояд илова ва тарҳ карда шаванд, пас ворид кардани Ҳарфҳо аз клавиатура илова кардани онҳоро бо Рақамҳо ғайриимкон месозад (биёед, ҷамъи ин ду тағирёбандаро бо ҳарфи S ишора кунем). Аз ин рӯ, ҳамчун як даста tryмо бояд тафтиш кунем, ки оё рақами А-ро, ки Рақамҳо дорад, ба рақами В, ки Ҳарфҳо дорад (яъне S = A + B) илова кардан мумкин аст ва агар ин имконнопазир бошад ва ин имконнопазир бошад, пас муайян чораҳо андешидан лозим аст, ки Хатогиҳо Ин рӯй надиҳад ва Interrupt нав бо саволи "чӣ бояд кард?" ба протсессор парвоз накунад. Агар дар барнома ягон истисно мавҷуд набошад, иҷрои он аз ҷониби протсессор қатъ карда мешавад. Агар Истисно вуҷуд дошта бошад, вақте ки он бо фармони "сайд" мешавад try, идоракунӣ ба фармон мегузарад catch, ки метавонад ҳалли алтернативӣ муқаррар кунад, масалан, мо ин ду рақамро илова намекунем, балки S = ​​A муқаррар мекунем.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* сатри “int r = 1;” иҷро намешавад, зеро хатогӣ рух дод ва барнома корро мустақиман ба коркардкунандаи истисноҳо равона мекунад (блоки сайд*/ Ҳамин тариқ, мавҷудияти Истисноҳо имкони ҳалли мушкилотро дар дохor барнома бидуни партофтани он ба сатҳи протсессор мебошад. Объекти "истисно", ки tryҳангоми ошкор шудани хато дар блок ба таври худкор эҷод мешавад, арзиши навъи хаторо дар бар мегирад. Биёед онро "Истиснои мо" меномем - барои парвандаи мушаххаси мо бо тавсифи хатои мушаххаси мо. Офарандагони забони Java пешакӣ рӯйхати муайяни хатогиҳои маъмулӣ ва вариантҳои маъмулии ислоҳи онҳоро таҳия кардаанд, яъне дар java як китобхонаи муайяни Истисноҳо мавҷуд аст , ки мо метавонем ба он муроҷиат кунем, то хатогиеро, ки рух додааст, ҳал кунем. codeи коркардро худамон нанависем ва аз ин рӯ, OurException эҳтимолан аллакай касе тавсиф шудааст, бинобар ин мо танҳо бояд донем, ки номи кадоме аз ин истисноҳоро ба барномаи мо ворид кардан лозим аст, то codeеро, ки дар он нокомӣ эҳтимолан рух дода метавонад, ворид кунад. Агар мо хато кунем ва Истиснои нодурустро аз китобхона интихоб кунем , он гоҳ коркардкунанда онро "сайд" намекунад, хато дар дохor барнома ҳалли худро намеёбад ва дархост ба протсессор фиристода мешавад. Аммо барои танбалҳо роҳе ҳаст. Агар мо номи истисноеро, ки аз китобхона ба мо лозим аст, надонем, пас мо метавонем истиноди умумиро бо номи “ Истисно ” гирем, чунон ки дар мисоли дар боло тавсифшуда. Ин истисно қодир аст, ки ҳама гуна хатогиҳоро ҳал кунад, аммо он қодир нест, ки маълумоти мушаххасро дар бораи ҳодисае, ки мо онро сабт карда метавонем, пешниҳод кунад. Китобхонаи Истисноҳои қаблан навишташуда аз Истисноҳои тафтишшуда ва санҷинанашуда иборат аст . Санҷишҳо онҳое мебошанд, ки онҳоро бидуни халалдор кардани кори барнома ислоҳ кардан мумкин аст, яъне агар мо кӯшиш кунем, ки файлро дар ҷузвдоне кушоем, ки он дар он мавҷуд нест, система дар ин бора ба мо хабар медиҳад, мо метавонем файлро партофта гузорем. ба ҷузвдони дилхоҳатон ворид кунед ва барномаро идома диҳед. Яъне, воқеан, дархост барои Interrupt ба протсессор фиристода шуд , аммо бидуни савол: "ҷустуҷӯ кунед, ки дар ин мушкилот чӣ кор кардан лозим аст?!?!" Мо Interrupt-ро, ки худамон ошкор кардем, бо дастури тайёр фиристодем, ки протсессор онро коркард карда, иҷрои барномаро идома дод. Он хатогиҳое ҳастанд, ки ислоҳ кардан ғайриимкон аст ва пеш аз ба итмом расидани барнома баста мешавад, яъне дархости қатъ ба протсессор фиристода мешавад., ки дар ҳар сурат иҷрои барномаро қатъ мекунад. Ягона нуктаи навиштани чунин истисноҳо дар барнома ин аст, ки ба корбар фаҳмад, ки чӣ ҳодиса рух додааст, зеро мо метавонем дар экран паёми иттилоотиро нишон диҳем, ки чаро барнома шикаст хӯрд. Сабаби дуюми ба даст овардани чунин таваққуфҳо қобorяти сабт кардани онҳо дар гузоришҳо барои таҳлor минбаъда мебошад (шумо ҳакер шудаед, аммо ҳадди аққал шумо медонед, ки дар куҷо). Оқибати мавҷудияти чунин китобхонаҳо зарурати дар хотир доштан дар бораи дохил кардани онҳост. (Рӯйхати Истисноҳои санҷидашуда ва носанҷидаро бо китобхонаҳо метавон пайдо кард, масалан, дар ин ҷо ) Агар мо дақиқ надонем, ки кадом китобхонаро дохил кардан лозим аст ё имконоти хато вуҷуд дорад, мо метавонем catchИстисноҳои заруриро дар якчанд номбар кунем. Худи система коркардкунандаи дурустро интихоб мекунад, агар он дар рӯйхат бошад. Ба ҷои Истиснои мушаххас, шумо метавонед " Истисно " -и умумиро нависед , ки метавонад ҳама намуди Истисноро идора кунад , агар он дар блокҳои қаблӣ коркард нашуда бошад.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
Агар блок мавҷуд бошад, tryИстисно ба таври худкор эҷод карда мешавад. Агар ба мо лозим ояд, ки Истисноро дар ягон лаҳза маҷбур созем , пас фармон истифода мешавад throw. Яъне, мо мустақилона an object эҷод мекунем new throw... баъд аз он, барнома кори худро қатъ мекунад, дархости қатъро ба протсессор мефиристад ва ба бахши барнома интиқол дода мешавад catch, ки аз он ҷо кӯшиш мекунад дастурҳоро барои амалҳои минбаъда гирад. Бо дастӣ эҷод кардани Истисно , мо метавонем навъи мушаххаси онро аз китобхона муайян кунем:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
он гоҳ коркардкунанда блокро catchбо ин Истиснои мушаххас ҷустуҷӯ мекунад - ҷустуҷӯ дар тамоми барнома, дар ҳама ҷонибҳо catch. Пас аз throwфармони коркарди Истисно, ҳамаи codeҳои боқимондаи барнома иҷро намешаванд, ба истиснои он, ки дар блок аст catch. Агар коркардкунанда дар барнома пайдо нашавад, ба протсессор савол дода мешавад: "худатон тасмим гиред, ки чӣ кор кунед" ва он барномаро қатъ мекунад. Занг ... метавонад ҳам дар дохor блок ва ҳам берун аз блок new throwанҷом дода шавад (ҳар ҷо дар барнома)>try
try {
   /* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Огоҳӣ дар бораи истисноҳо

Усулҳое, ки қаблан аз ҷониби касе навишта шуда буданд, метавонанд партофтани Истисноҳоро дар бар гиранд. Танҳо барои бехатар будан, барномасозе, ки codeро навишт, барномасозони минбаъдаро ҳушдор дод, ки дар усули навиштаи ӯ хатогӣ рух диҳад. Ҳамин тавр, масалан, усули эҷоди файл, ки дар зер тавсиф шудааст, пешбинӣ мекунад, ки ҳангоми эҷоди файл метавонад хатогӣ рух диҳад (дар роҳи додашуда ягон файл вуҷуд надорад), ин маънои онро дорад, ки коркардкунандаи хато лозим мешавад:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Аммо дар айни замон, худи коркардкунанда вуҷуд надорад, ки ин маънои онро дорад, ки ҳоло мо наметавонем усули навишташударо дар барномаи худ дар ҳолати муқаррарӣ даъват кунем. Ҳоло мо бояд коркардкунандаи хато нависед ва ин усулро дар блок даъват кунем try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

Истисноҳои ватанӣ

Агар китобхонаҳои мавҷуда барои мо кофӣ набошанд, барои бартараф кардани хатогиҳои муайян истисноҳои худро навиштан мумкин аст. Барои ин, мо танҳо синферо эҷод мекунем, ки аз синфи Exception мерос мегирад
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Ҳангоми эҷоди истисноҳои худ ду қоидаро бояд дар хотир дошта бошед:
  1. Номи синфи мо бояд бо "истисно" хотима ёбад
  2. Синф бояд конструкторро бо тағирёбандаи сатр дошта бошад, ки ҷузъиёти масъалаи Истисноро тавсиф мекунад. Дар конструктор суперконструктор даъват карда мешавад ва паём фиристода мешавад.
Намунаи истифодаи истиснои тавлидшуда:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
Мо ин Истисноро бо code мегирем:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
Натиҷаи иҷрои барнома чунин хоҳад буд: StudentNotFoundException: Донишҷӯро бо ID 0000001 ёфтан муяссар нашуд

Чаро шумо бояд Истисноҳоро нависед?

Дар соли 1996, мушаки Ariane 5 аз сабаби табдor нодурусти тағирёбандаи шинокунанда ба тағирёбандаи бутун суқут кард. Дар ин ҳолат ягон истисно ё идоракунанда вуҷуд надошт. Агар ҳангоми зеркашии файл қатъ шудани пайвастшавӣ ба Интернет ба амал ояд, мавҷудияти Истисно ба шумо имкон медиҳад, ки пас аз барқарор шудани пайвастшавӣ зеркаширо идома диҳед. Агар ягон истисно вуҷуд надошта бошад, зеркашӣ бояд дубора оғоз шавад.

Иқтибосҳо:

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION