JavaRush /Блоги Java /Random-TG /Stack Trace ва он бо чӣ мехӯрад
Alukard
Сатҳи
London

Stack Trace ва он бо чӣ мехӯрад

Дар гурӯҳ нашр шудааст
Дар ин мақола, шумо мефаҳмед ва мефаҳмед, ки падидаи Java StackTrace, ки бо номи Call Stack Tracing маъруф аст, чӣ гуна кор мекунад. Ин маълумот барои шурӯъкунандагон, ки бо ин консепсия дар ибтидои Java Syntax Level 9 дучор омадаанд, сохта шудааст. Ман фикр мекунам, ки ҳамаи шумо ҳадди аққал як маротиба ҳангоми кор дар IDE-и худ, новобаста аз он ки Idea , Eclipse ё чизи дигар, бо хатогиҳои шабеҳ дучор шудаед.
Exception in thread "main" java.lang.ArithmeticException
	at com.example.task01.Test.division(Test.java:10)
	at com.example.task01.Test.main(Test.java:6)
Ин, чунон ки шумо тахмин кардаед, пайгирии мост. Аммо ба воҳима шитоб накунед, ҳоло мо ин мисолро барои шумо тақсим мекунем. Аввал шумо бояд фаҳмед, ки он тавре ки аз номаш бармеояд, StackTraceкор мекунад . СтэкДар ин бора каме муфассалтар таваққуф хоҳем кард. Чӣ тавр коллексияи Stack кор мекунад Дар сатҳи ҳаштум, шумо аллакай бо коллексияҳо шинос шудаед ва медонед, ки онҳо ба се гурӯҳ тақсим мешаванд Set- маҷмӯи, List- рӯйхат, Map- луғат (ё харита). Мувофиқи JavaRush (c). Мо Stackяк қисми гурӯҳ аст List. Принсипи кори онро метавон ҳамчун LIFO тавсиф кард , ки маънои Last In First Outро дорад. Маҳз, ин рӯйхатест, ки ба як стеки китобҳо монанд аст; Барои гирифтани унсуре, ки мо дар Stackаввал гузоштаем, мо бояд аввал ҳамаи унсурҳоеро, ки баъд аз он ба рӯйхат илова кардаем, истихроҷ кунем. Тавре ки дар расми боло нишон дода шудааст, бар хилофи мисол, рӯйхати муқаррарӣ ArrayList, ки мо метавонем ягон элементро аз рӯйхат аз рӯи индекс ба даст орем. Бори дигар барои тақвият. Гирифтани элемент аз он Стэкатанҳо аз охири имконпазир аст! Дар ҳоле ки унсури аввалини ба он иловашуда дар ибтидо аст (ё дар поён, тавре ки қулайтар аст). Инҳо усулҳое мебошанд, Stack ки Объекти мо дорад push()- Элементро ба болои стек илова мекунад. Объект pop()- Элементро дар болои стек бар мегардонад ва онро дар раванд нест мекунад. Объект peek()- Элементро дар болои стек бармегардонад, аммо онро нест намекунад. int search()- Ҷустуҷӯи элемент дар стек. Агар пайдо шавад, ҷуброни он аз болои стек баргардонида мешавад. Дар акси ҳол -1 баргардонида мешавад. логикӣ empty()- холӣ будани стекро тафтиш мекунад. Агар стек холӣ бошад, ҳақиқиро бармегардонад. Агар стек элементҳо дошта бошад, нодуруст бармегардад. Пас, чаро ба шумо Javaлозим аст StackTrace, ки дар асоси принсипҳои амалиёт сохта шудааст Stack? Биёед мисоли хатоеро, ки дар поён ҳангоми иҷрои чунин як барномаи оддӣ рух дод, дида бароем.
public class Test {

    public static void main(String[] args) {
        System.out.println(convertStringToInt(null));
    }

    public static int convertStringToInt(String s) {
        int x = Integer.parseInt(s);
        return x;
    }
}
Мо синф Testбо ду усул дорем. Ҳама шиносанд mainва convertStringToIntмантиқи он табдил додан ва баргардонидани сатри аз берун (яъне аз метод main) гирифташударо ба адади бутуни навъи int. Тавре ки шумо мебинед, мо дидаву дониста параметрро ба ҷои сатр бо рақами null. Усули мо ин параметрро дуруст коркард карда натавонист ва хатогӣ ба вуҷуд овард NumberFormatException. Тавре ки шумо медонед, барнома ба коркарди кори худ аз метод оғоз мекунад mainва дар айни замон он як наверо Стэкбо ном эҷод мекунад StackTrace, ки дар он арзиши ҷории кори худро зери рақами 1 мегузорад , пас мо боз ба усул convertStringToIntва барнома мегузарем. параметрҳои ҷойгиршавии моро ба оне, ки қаблан StackTraceдар зери рақами 2 сохта шуда буд, ворид мекунад , пас онро усули ноаён ба чашми мо parseIntдар синф ҷойгир аст Integerва ин аллакай элементи рақами 3- и мо хоҳад буд StackTrace, дар ин усул боз як занги дохилӣ илова карда мешавад. ба StackTraceрақами 4 барои санҷидани элемент барои нул , ки ба хатогӣ оварда мерасонад. Барнома бояд хатогии моро нишон диҳад, ки тамоми занҷири гузаришҳои моро то он даме, ки хато рух диҳад, нишон диҳад. Дар ин ҷо он чизе, ки қаблан бо маълумоти гузаришҳои мо сохта шудааст, ба кӯмаки ӯ меояд StackTrace.
Exception in thread "main" java.lang.NumberFormatException: null
	at java.base/java.lang.Integer.parseInt(Integer.java:614)
	at java.base/java.lang.Integer.parseInt(Integer.java:770)
	at com.example.task01.Test.convertStringToInt(Solution.java:10)
	at com.example.task01.Test.main(Solution.java:6)
Пеш аз он ки хатогӣ рух диҳад, барнома ба усулҳои амиқ дохил шуд, аммо ҳамин ки хатогӣ рух дод, ҳама чиз бо тартиби баръакс рӯй медиҳад. Сатри тавсифи мушкилот чоп карда мешавад (№1 дар мисол), пас арзиши охирин (ва дар боло) ба арзиши мо гирифта мешавад, Стэкон рақами чор буд ва дар консол чоп карда мешавад (№ 2 дар мисол) ва мо мебинем, ки мушкилот дар синф Integerдар сатри codeи 614 ба миён омадааст ва ин сатр, сатри 770-и усули parseIntҳамон синф (№ 3 дар мисол) номида мешавад, ки ҳангоми илова ба Стэкрақами сеюм ва ин усули синф, то ҳол ба мо намоён нест, аллакай бо усули мо , ки дар сатри 10-и барномаи мо ҷойгир аст, Integerдаъват шуда буд (дар мисоли № 4 ва ҳангоми илова кардани он дуюм буд) ва он дар навбати худ, дар хати 6 (№ 5) даъват карда шуд. дар мисол ва ҳангоми илова кардан, мутаносибан, якум). Ҳамин тавр, бо нигоҳ доштани усулҳои даъватшудаи худ қадам ба қадам, мо тавонистем ба чопи параллелӣ маълумоте баргардем, ки моро маҳз ба хатогӣ овардааст. Аммо ин на танҳо бо хатогиҳо кор мекунад, балки ба мо имкон медиҳад, ки дар бораи раванди дархости мо маълумоти зиёди ҷолиб ба даст орем. Биёед боз як мисоли маъмулро дар шарҳҳои лексияи асосии сатҳи 9 дида бароем. Мо code дорем ва ман фавран ба он расмеро замима хоҳам кард, ки раванди барномаро визуалӣ мекунад: convertStringToIntmainСтекmainStackTrace
public class Test {
    public static void main(String[] args) {
        method1();
        method2();
    }
    public static void method1() {
        //не вызывает ничего
    }
    public static void method2() {
        method3();
        method4();
    }
    public static void method3() {
        //не вызывает ничего
    }
    public static void method4() {
        method5();
    }
    public static void method5() {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        for (StackTraceElement element:stackTraceElements) {
            System.out.println(element.getMethodName());
        }
    }
}
Stack Trace ва бо он чӣ хӯрда мешавад - 2 Дар ин чо барномаи мо кори худро бенуксон ичро мекунад ва ба охир мерасад. Ин аст он чизе ки мо дар баромади консол мебинем:
getStackTrace
method5
method4
method2
main

Process finished with exit code 0
Мо ин хулосаро чй тавр ба даст овардем ва дар усули панчум аз сатри 20 сар карда, чй шуд? Ман метарсам, ки беҳтарин чизе, ки ман карда метавонам, илова кардани шарҳи маъмултарин (ихтисоршуда) аз ҷониби корбар Кирилл аз шарҳҳо ба лексия. Биёед ба хати эҷод рӯй оварем StackTraceва онро унсур ба унсур таҳлил кунем:
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
StackTraceElement[]- нишон додани навъи массив (Дар сатҳҳои аввал шумо аллакай дар бораи массивҳо ба монанди int[], String[] омӯхтед, ин ҷо ҳамон аст). stackTraceElements- номи массив метавонад ҳама чиз бошад, бо назардошти қоидаҳои умумии номгузорӣ, ин ба кор таъсир намерасонад. Thread.currentThread()- гирифтани истинод ба риштаи ҷорӣ, ки дар он усулҳое, ки мо мехоҳем пайгирӣ кунем, иҷро мешаванд (ҳоло ин муҳим нест, шумо риштаҳоро дар сатҳи 16 дар quest Java Core муфассалтар таҳлил хоҳед кард) getStackTrace()- мо ҳама Стэкусулҳои номбаршударо мегирем (Ин як дастраскунандаи муқаррарӣ барои StackTrace) Акнун биёед бубинем, ки массиви сохташуда барои мо чӣ муфид буда метавонад. Мо мефаҳмем, ки массив маълумотро дар бораи усулҳои иҷрошуда нигоҳ медорад. (в) Ва барои ин, дар хати 21, мо як цикли тағирёфтаро оғоз мекунем (дар омади forгап forEach, барои онҳое, ки ин давраро ҳанӯз наомухтаанд, ман ба шумо маслиҳат медиҳам, ки дар бораи он хонед) ва маълумотро аз массив ба консол баровардан , яъне маълумот дар бораи кадом усулҳо ҳангоми кор бо истифода аз сохтмон иҷро карда шуданд element.getMethodName(). Диққат, тавре ки мебинем, унсури сифрии массив мутаносибан худаш буд getStackTrace(), зеро дар лаҳзаи қабули массиви маълумот ин усули охирин буд, ки иҷро шуда буд ва ба ин васила дар боло ба итмом расид Стэкава сохтмони моро ба ёд овард. Охирин ворид, аввал баромад ” фавран аввалинест, ки ба массив зери элементи сифр илова карда мешавад. Ин аст чизи дигаре, ки мо метавонем аз StackTraceElement: String getClassName()- Номи синфро бармегардонад. Сатр getMethodName()- Номи усулро бармегардонад. Сатр getFileName()- Номи файлро бармегардонад (дар як файл метавонад синфҳои зиёд дошта бошад). Сатр getModuleName()- Номи модулро бармегардонад (метавонад нул бошад). Сатр getModuleVersion()- Варианти модулро бармегардонад (метавонад нул бошад). int getLineNumber()- Рақами сатри файлро, ки дар он метод даъват шуда буд, бармегардонад. Акнун, ки шумо принсипи умумии фаъолиятро дарк мекунед, ман ба шумо маслиҳат медиҳам, ки StackTraceдар Ide худ усулҳои гуногунро санҷед . Ҳатто агар шумо ҳама чизро пурра азхуд накарда бошед ҳам, омӯзишро идома диҳед ва муаммо ҳамон тавре хоҳад шуд, ки дар ин масъала барои ман рӯй дод. Ба ҳамаатон муваффақият орзумандам! Ps Агар ин мавод ба шумо маъқул шуда бошад, лутфан онро бо лайк дастгирӣ кунед. Барои шумо мушкил нест, ман хурсандам. Ташаккур ва шуморо дар сатҳи 41 мебинем;)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION