JavaRush /Java Blog /Random-TL /Stack Trace at kung ano ang kinakain nito
Alukard
Antas
London

Stack Trace at kung ano ang kinakain nito

Nai-publish sa grupo
Sa artikulong ito, matututunan at mauunawaan mo kung paano gumagana ang Java phenomenon na StackTrace, na kilala rin bilang Call Stack Tracing. Ang impormasyong ito ay naayos para sa mga baguhan na nakatagpo ng konseptong ito sa simula ng Java Syntax Level 9. Sa tingin ko lahat kayo, kahit isang beses, ay nakatagpo ng mga katulad na error kapag nagtatrabaho sa iyong IDE, hindi alintana kung ito ay Idea , Eclipse o iba pa.
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)
Ito, tulad ng nahulaan mo, ay ang aming pagsubaybay. Ngunit huwag magmadali sa panic, ngayon ay sisirain namin ang halimbawang ito para sa iyo. Una kailangan mong maunawaan ang katotohanan na StackTracegumagana ito tulad ng Стэкiminumungkahi ng pangalan nito. Sa puntong ito ay tatalakayin natin nang mas detalyado. Paano gumagana ang koleksyon ng Stack Sa ikawalong antas, nakilala mo na ang mga koleksyon at alam mong nahahati sila sa tatlong grupo Set- set, List- list, Map- dictionary (o mapa). Ayon sa JavaRush (c). Ang amin Stackay bahagi ng grupo List. Ang prinsipyo ng pagpapatakbo nito ay maaaring ilarawan bilang LIFO , na nangangahulugang Huling In First Out. Ibig sabihin, ito ay isang listahan na katulad ng isang stack ng mga libro; upang kunin ang elementong inilagay namin muna Stack, kailangan muna naming i-extract ang lahat ng mga elemento na idinagdag namin sa aming listahan pagkatapos. Tulad ng ipinahiwatig sa larawan sa itaas, hindi katulad, halimbawa, isang regular na listahan ArrayListkung saan makakakuha tayo ng anumang elemento mula sa listahan ayon sa index. Muli para sa reinforcement. Ang pagkuha ng isang elemento mula sa Стэкаay posible lamang mula sa dulo! Habang ang unang elemento na idinagdag dito ay nasa simula (o sa ibaba, bilang mas maginhawa). Ito ang mga pamamaraan na mayroon ang ating Stack Object push()- Nagdaragdag ng elemento sa tuktok ng stack. Bagay pop()- Ibinabalik ang elemento sa tuktok ng stack, inaalis ito sa proseso. Bagay peek()- Ibinabalik ang elemento sa tuktok ng stack, ngunit hindi ito inaalis. int search()- Naghahanap ng elemento sa stack. Kung natagpuan, ang offset nito mula sa tuktok ng stack ay ibabalik. Kung hindi -1 ay ibinalik. boolean empty()- Sinusuri kung walang laman ang stack. Nagbabalik ng true kung walang laman ang stack. Nagbabalik ng false kung ang stack ay naglalaman ng mga elemento. Kaya bakit Javakailangan mo StackTraceng isa na binuo sa mga prinsipyo ng operasyon Stack? Tingnan natin ang halimbawa ng isang error sa ibaba na naganap sa panahon ng pagpapatupad ng tulad ng isang simpleng programa.
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;
    }
}
Mayroon kaming isang klase Testna may dalawang pamamaraan. Ang lahat ay pamilyar mainat convertStringToIntang lohika nito ay upang i-convert at ibalik ang isang string na natanggap mula sa labas (lalo na mula sa pamamaraan main) sa isang integer na numero ng uri int. Gaya ng nakikita mo, sinasadya naming ipasa ang parameter sa halip na isang string na may ilang numero null. Hindi maproseso ng aming pamamaraan ang parameter na ito nang tama at nagdulot ng error NumberFormatException. Tulad ng alam mo, ang programa ay nagsisimulang gawin ang gawain nito mula sa pamamaraan mainat sa sandaling ito ay lumilikha ito ng bago Стэкna may pangalan StackTracekung saan inilalagay nito ang kasalukuyang halaga ng trabaho nito sa ilalim ng numero 1 , pagkatapos ay pumunta kami sa pamamaraan convertStringToIntat sa programa muli ipinapasok ang mga parameter ng aming lokasyon sa isa na ginawa nang mas maaga StackTracesa ilalim ng numero 2 , pagkatapos ito ay tinatawag na isang pamamaraan na hindi nakikita ng aming mga mata parseIntna matatagpuan sa klase Integerat ito ay magiging elemento bilang 3 namin StackTrace, sa paraang ito ay magkakaroon ng isa pang panloob na tawag na idaragdag sa StackTracenumero 4 upang suriin ang elemento para sa null na hahantong sa isang error. Kailangang ipakita ng program ang aming error na nagsasaad ng buong chain ng aming mga transition hanggang sa mangyari ang error. Dito tumulong sa kanya ang dati nang ginawa gamit ang data ng aming mga transition 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)
Bago nangyari ang error, ang programa ay pumasok nang malalim sa mga pamamaraan, ngunit sa sandaling naganap ang error, ang lahat ay nagsisimulang mangyari sa reverse order. Ang isang linya na naglalarawan sa problema ay naka-print (No. 1 sa halimbawa), pagkatapos ay ang huling (at sa itaas) na halaga na idinagdag sa amin ay kukunin, Стэкito ay numero apat at naka-print sa console (No. 2 sa halimbawa) at nakita namin na ang problema ay lumitaw sa klase Integersa 614 na linya ng code at tinawag ang linyang ito, linya 770 ng isang pamamaraan parseIntng parehong klase (No. 3 sa halimbawa) na, kapag idinagdag sa, Стэкay numero ng tatlo at ang pamamaraan ng klase na ito, Integerhindi pa rin nakikita sa amin, ay tinawag sa pamamagitan ng aming pamamaraan convertStringToIntna matatagpuan sa linya 10 ng aming programa (No. 4 sa halimbawa, at kapag idinagdag ito ay pangalawa), at ito naman, ay tinawag mainsa linya 6 (No. 5 sa ang halimbawa, at kapag idinaragdag, ayon sa pagkakabanggit, ang una). Kaya, sa pamamagitan ng pag-iimbak Стекng aming mga tinatawag na pamamaraan nang sunud-sunod, nakabalik kami sa mainparallel na pag-print ng impormasyon na eksaktong humantong sa amin sa error. Ngunit StackTracehindi lamang ito gumagana sa mga error, nagbibigay-daan ito sa amin na makakuha ng maraming kawili-wiling impormasyon tungkol sa proseso ng aming aplikasyon. Tingnan natin ang isa pang tanyag na halimbawa sa mga komento sa pangunahing panayam ng antas 9. Mayroon kaming code at agad akong mag-attach ng isang larawan dito na nagpapakita ng proseso ng programa:
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 at kung ano ang kinakain nito - 2 Dito ginagawa ng aming programa ang trabaho nito nang walang kamali-mali at nagtatapos. Ito ang makikita natin sa output ng console:
getStackTrace
method5
method4
method2
main

Process finished with exit code 0
Paano namin nakuha ang konklusyong ito at kung ano ang nangyari sa ikalimang paraan, simula sa linya 20? Natatakot ako na ang pinakamahusay na magagawa ko ay idagdag ang pinakasikat na paliwanag (pinaikli) ng user na si Kirill mula sa mga komento hanggang sa lecture. Lumiko tayo sa linya ng paglikha StackTraceat suriin ito ng elemento sa pamamagitan ng elemento:
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
StackTraceElement[]- isang indikasyon ng uri ng array (Sa mga unang antas ay natutunan mo na ang tungkol sa mga array tulad ng int[], String[], narito ito ay pareho). stackTraceElements- ang pangalan ng array ay maaaring maging anuman, isinasaalang-alang ang pangkalahatang mga panuntunan sa pagbibigay ng pangalan, hindi ito nakakaapekto sa trabaho. Thread.currentThread()- pagkuha ng isang link sa kasalukuyang thread kung saan ang mga pamamaraan na gusto naming subaybayan ay naisakatuparan (sa ngayon ay hindi ito mahalaga, susuriin mo ang mga thread nang mas detalyado sa antas 16 sa Java Core quest) getStackTrace()- nakuha namin ang lahat Стэкng mga tinatawag na pamamaraan (Ito ay isang regular na getter para sa StackTrace) ​​Ngayon, tingnan natin kung ano ang maaaring maging kapaki-pakinabang sa atin ng ginawang array. Nauunawaan namin na ang array ay nag-iimbak ng impormasyon tungkol sa mga isinagawang pamamaraan. (c) At para dito, sa ika-21 na linya, naglulunsad kami ng isang binagong cycle forna tinatawag forEach(sa pamamagitan ng paraan, para sa mga hindi pa nag-aral ng cycle na ito, ipinapayo ko sa iyo na basahin ang tungkol dito) at mag-output ng data mula sa array hanggang sa console , lalo na ang impormasyon tungkol sa kung aling mga pamamaraan ang isinagawa sa panahon ng trabaho gamit ang konstruksiyon element.getMethodName(). Pansin, tulad ng nakikita natin, ang zero na elemento ng array ay naging mismo, getStackTrace()ayon sa pagkakabanggit, dahil sa sandaling matanggap ang array ng data ito ang huling paraan na naisakatuparan at sa gayon ay natapos sa tuktok Стэка, at naaalala ang aming pagtatayo " Ang huling papasok, unang labas ” ay agad ang unang idadagdag sa array sa ilalim ng zero element. Narito kung ano pa ang makukuha natin mula sa StackTraceElement: String getClassName()- Ibinabalik ang pangalan ng klase. String getMethodName()- Ibinabalik ang pangalan ng pamamaraan. String getFileName()- Ibinabalik ang pangalan ng file (maaaring maraming klase sa isang file). String getModuleName()- Ibinabalik ang pangalan ng module (maaaring null). String getModuleVersion()- Ibinabalik ang bersyon ng module (maaaring null). int getLineNumber()- Ibinabalik ang numero ng linya sa file kung saan tinawag ang pamamaraan. Ngayon na naiintindihan mo na ang pangkalahatang prinsipyo ng pagpapatakbo, ipinapayo ko sa iyo na subukan ang iba't ibang mga pamamaraan StackTracesa iyong Ide . Kahit na hindi mo pa ganap na pinagkadalubhasaan ang lahat, magpatuloy sa pag-aaral at ang palaisipan ay lalabas sa parehong paraan na nangyari para sa akin sa bagay na ito. Nais kong tagumpay kayong lahat! Ps Kung nagustuhan mo ang materyal na ito, mangyaring suportahan ito ng like. Hindi ito mahirap para sa iyo, natutuwa ako. Salamat at magkita-kita tayo sa level 41 ;)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION