JavaRush /Java блогу /Random-KY /Javaдагы өзгөчөлүктөр
Roman
Деңгээл

Javaдагы өзгөчөлүктөр

Группада жарыяланган
Мен "Өзгөчө кырдаалдар" деген теманы кезиктиргенде, анын баары кантип иштээрин толук түшүнүү үчүн Интернеттин ар кайсы бурчтарынан жооп издөөгө туура келген көптөгөн суроолор пайда болду. Натыйжада, мен өзүмдүн түшүндүрмөмдү түздүм, бул бул көрүнүшкө жаңы гана туш болгон жаңыдан баштагандар үчүн түшүнүктүү болушу мүмкүн. Javaдагы өзгөчөлүктөр - 1Компьютерлерде үзгүлтүк – бул процессорго дароо жооп кайтарууну талап кылган окуя болуп жаткандыгы жөнүндө кирүүчү сигнал. Үзүлүү сигналы процессордон иштеп жаткан программаны бир аз кийинчерээк улантуу үчүн тындырууну талап кылат, башкача айтканда, компьютер программанын аткарылышы менен байланышкан бардык маалыматты эстеп калышы керек. Мындай үзгүлтүктөр убактылуу, эгерде өлүмгө алып келбейт. Мындай үзгүлтүктөр программалык codeдон же аппараттык камсыздоонун кээ бир функцияларынан (мисалы, клавиатурадагы баскычтарды жөн эле басуу; таймерлер, мисалы, компьютерди автоматтык түрдө өчүрүү) себеп болушу мүмкүн. Үзгүлтүктөрдүн саны белгилүү бир процессордун өндүрүшүнө орнотулган белгилүү бир сан менен чектелет, башкача айтканда, бул үчүн атайын байланыш "каналдары" бөлүнгөн, бул процессорго бардык башка процесстерди айланып өтүүгө мүмкүндүк берет. Аткаруучу программа codeунда ката пайда болгондо да үзгүлтүктөр автоматтык түрдө түзүлөт (мисалы, нөлгө бөлүү пайда болгондо). Мындай үзгүлтүктөр салттуу түрдө тузак же өзгөчө жагдайлар деп аталат . Мындай учурларда: "Өзгөчөлүк ташталды" деп айтуу салтка айланган, башкача айтканда, Exception иштетилди же Exception ыргытылды (ыргытылды), башкача айтканда, үзгүлтүккө учуроо өтүнүчү."эмне кылуу керек?" деген суроо менен. процессорго жөнөтүлөт. Бул учурда процессор токтоп калган жерин, тагыраак айтканда, кийинки клетканын кластерин эстеп, ишин токтотот, андан маалымат аткарылышы керек. Аткарылган жана АТКАРЫЛБАГАН көрсөтмөлөрдүн бүткүл тизмеги эсте калат. Андан кийин, процессор мындай ката болгон учурда иш-аракет үчүн эстутумдагы көрсөтмөлөрдү окуйт. Бул нускамага ылайык, ал белгилүү кластерлерге жаңы маанилерди киргизе алат, кээ бир иш-аракеттер чынжырларын же жаңы циклди (мисалы, кайтаруу же цикл циклин) кошо алат, башкача айтканда, мурда коюлган катага жараша. ылдый көрсөтмөлөр аткарылат. Компьютер системасынын өзүндө көптөгөн автоматтык үзгүлтүктөр орнотулган, алар белгилүү бир убакыттан кийин иштетилет, мисалы, компьютерде иштеп жаткан процесстерди башкаруу же орнотулган сигналдарды иштетүү, кирүүчү тышкы сигналдарды чогултуу жана ар кандай маалымат конвертерлери. Көптөгөн үзгүлтүктөр бир катар себептерден улам системаны толугу менен "orп" коюшу мүмкүн экенин эстен чыгарбоо керек. Программа codeундагы ката процессордо автоматтык түрдө үзгүлтүккө учурайт, ал белгиленген нускамаларга ылайык иштетүүгө аракет кылат. Бирок бардык үзгүлтүктөр аларды иштетүү үчүн иштелип чыккан эмес, же ал бизге туура келбеген proceduresаны жаратышы мүмкүн, мисалы, ал жөн гана колдонмону бузуп салат. Ошондуктан, программалоодо, программалоочу ката мүмкүнчүлүгүн көрө турган codeдун белгилүү бир бөлүгү үчүн өзүңүздүн үзгүлтүкүңүздү уюштурууга болот. Бул учурда ката программанын ичинде иштетилет жана инструкцияларды иштетүү үчүн процессорго кайрылbyte. Мындай блокторду аныктоо "Өзгөчө" Объектти түзүү менен уюштурулат . Бул an object автоматтык түрдө блокто түзүлөт try-catch. Блок >tryкатанын бар-жогу үчүн текшерилет жана эгер бар болсо, программа блокко барат catch, анда катаны алдын алуу же деңгээли боюнча иш-аракеттер жасалат. Мисалы, клавиатурадан Сандарды киргизсек , алар кийинчерээк кошулуп жана кемитилсе, анда баскычтоптон тамгаларды киргизүү аларды Сандар менен кошууга мүмкүн болбой калат (бул эки өзгөрмөнүн суммасын S тамгасы менен белгилейли). Ошондуктан, команда катары tryбиз Сандарды камтыган А санын Тамгаларды камтыган В санына кошууга болобу, жокпу, текшеришибиз керек (башкача айтканда, S = A + B) жана бул мүмкүн эмес жана мүмкүн болбосо, анда белгилүү. Каталар Бул ЖОК жана “эмне кылуу керек?” деген суроо менен жаңы үзгүлтүк процессорго учуп кетпеши үчүн чараларды көрүү керек. Эгерде программада Exception жок болсо, анын аткарылышы процессор тарабынан үзгүлтүккө учурайт. Эгерде Exception бар болсо, ал команда тарабынан "кармалганда" 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;” аткарылbyte, анткени ката пайда болгон жана программа ишти түздөн-түз өзгөчө иштетүүчүгө багыттайт (кармап алуу блогу*/ Ошентип, Exceptions болушу программанын ичиндеги маселени процессордун деңгээлине ыргытпастан чечүү мүмкүнчүлүгү болуп саналат. tryКата табылганда блокто автоматтык түрдө түзүлүүчү “Exception” an objectи ката түрүнүн маанисин камтыйт. Аны "OurException" деп атайлы - биздин конкреттүү ишибиз үчүн, биздин конкреттүү катабыздын сүрөттөлүшү. Java тorнин жаратуучулары алдын ала типтүү каталардын белгилүү бир тизмесин жана аларды оңдоонун типтүү варианттарын түзүшкөн, башкача айтканда, javaда өзгөчөлүктөрдүн белгилүү бир китепканасы бар , биз пайда болгон катаны чечүү үчүн кайрыла алабыз. иштетүү codeун өзүбүз жазбашыбыз керек, ошондуктан OurException кимдир бирөө сүрөттөлгөн болушу мүмкүн, андыктан бул өзгөчөлүктөрдүн кайсынысын программабызга киргизиш керек экенин билүү керек, ал codeду иштетүү үчүн ката болушу мүмкүн. Эгерде биз ката кетирип, китепканадан туура эмес Exception тандап алсак , анда иштеткич аны “тушуп” алbyte, ката программанын ичинде чечим таба алbyte жана сурам процессорго жөнөтүлөт. Бирок жалкоолордун жолу бар. Эгерде китепканадан бизге керек болгон өзгөчөлүктүн атын билбесек, анда биз жогоруда сүрөттөлгөн мисалдагыдай эле “ Exception ” деген ат менен жалпысын алсак болот. Бул Exception каталардын ар кандай түрүн чечүүгө жөндөмдүү, бирок ал биз киргизе турган окуя тууралуу конкреттүү маалыматты бере алbyte. Мурда жазылган Өзгөчөлүктөрдүн китепканасы текшерилген жана белгиленбеген Өзгөчөлүктөрдөн турат . Текшерилүүчүлөрү - бул программанын ишин үзгүлтүккө учуратпастан оңдоого боло тургандар, башкача айтканда, файлды ал жок папкага ачууга аракет кылсак, система бул жөнүндө бизге кабарлап коёт, биз файлды таштай алабыз. каалаган папкага салып, программаны улантыңыз. Башкача айтканда, чындыгында, үзгүлтүккө учуратуу өтүнүчү процессорго жөнөтүлдү , бирок суроо жок: "бул көйгөй боюнча эмне кылуу керек экенин издеңиз?!?!" Процессор иштеп чыгып, программаны аткарууну уланткан даяр инструкция менен өзүбүз аныктаган Interrupt жөнөттүк. Оңдоого мүмкүн болбогон каталар белгиленбейт жана программа аяктаганга чейин жабылат, башкача айтканда, үзгүлтүккө учуратуу өтүнүчү процессорго жөнөтүлөт., кандай болгон күндө да программанын аткарылышын үзгүлтүккө учуратат. Программага мындай өзгөчөлүктөрдү жазуудагы бирден-бир жагдай - бул колдонуучуга эмне болгонун түшүнүүгө мүмкүнчүлүк берүү, анткени бул үзгүлтүктү байкап, экранда маалыматтык билдирүүнү көрсөтө алабыз, ошондуктан программа бузулду. Мындай үзгүлтүктөрдү кармоонун экинчи себеби - аларды кийинки талдоо үчүн журналдарга жазып алуу мүмкүнчүлүгү (сизге хакердик чабуул жасалган, бирок, жок дегенде, кайда экенин билесиз). Мындай китепканалардын болушунун кесепети аларды кошууну унутпаш керек. (Китепканалары бар текшерилген жана белгиленбеген Өзгөчөлүктөрдүн тизмесин, мисалы, бул жерден тапса болот ) Эгер кайсы китепкананы камтый турганыбызды так билбесек же бир нече ката варианттары бар болсо, анда биз 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өзгөчө кырдаал автоматтык түрдө түзүлөт. Эгерде бизге кандайдыр бир убакта Exception мажбурлоо керек болсо , анда команда колдонулат throw. Башкача айтканда, биз an objectти өз алдынча түзөбүз new throw... андан кийин программа өз ишин токтотуп, процессорго үзгүлтүксүз суроо-талапты жөнөтөт жана программанын бөлүмүнө которулат catch, ал жерден кийинки аракеттер үчүн көрсөтмөлөрдү алууга аракет кылат. Exception кол менен түзүү менен , биз китепканадан анын конкреттүү түрүн көрсөтө алабыз:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
catchандан кийин иштеткич ушул өзгөчө Exception менен блокту издейт - программа боюнча бардык тараптан издөө catch. Exception иштетүү буйругунан кийин throw, блоктогу codeдон башка бардык калган программа codeу АТКАРЫЛБАЙТ catch. Эгерде программада иштеткич табылбаса, процессорго суроо берилет: “эмне кылууну өзүң чеч” жана ал программаны үзгүлтүккө учуратат. Чалуу ... блоктун 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 другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Өзгөчө кырдаалдар жөнүндө кабарлоо

Мурда кимдир бирөө тарабынан жазылган методдорго Exceptions ыргытуу камтышы мүмкүн. Кооптонуу үчүн, 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);
}

Жергorктүү өзгөчөлүктөр

Учурдагы китепканалар бизге жетишсиз болсо, айрым каталарды чечүү үчүн өзүңүздүн өзгөчө учурларыңызды жазсаңыз болот. Бул үчүн, биз жөн гана Exception классынан мураска алган классты түзөбүз
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Өзүңүздүн өзгөчө учурларыңызды түзүүдө эки эрежени эске алуу керек:
  1. Биздин класстын аталышы "Exception" менен аякташы керек
  2. Класста Exception маселесинин чоо-жайын сүрөттөгөн сап өзгөрмөлүү конструктор болушу керек. Конструктордо супер конструктор чакырылат жана билдирүү жөнөтүлөт.
Түзүлгөн өзгөчөлүктү колдонуунун мисалы:
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);
        }
    }
}
Биз бул Exception 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 менен студент табылган жок

Эмне үчүн Сиз Exceptions жазуу керек?

1996-жылы Ariane 5 ракетасы сүзүүчү өзгөрмөнүн бүтүн санга туура эмес конversionсынан улам кыйроого учураган. Бул жагдай үчүн эч кандай өзгөчөлүктөр же башкаруучулар болгон эмес. Эгерде файлды жүктөө учурунда Интернетке туташуу үзүлсө, анда Exception болушу туташуу калыбына келтирилгенден кийин жүктөп алууну улантууга мүмкүндүк берет. Эч кандай Exception жок болсо, жүктөө кайра башталышы керек болот.

Шилтемелер:

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION