JavaRush /Java Blog /Random-TK /“Stack Trace” we onuň bilen näme iýilýändigi
Alukard
Dereje
London

“Stack Trace” we onuň bilen näme iýilýändigi

Toparda çap edildi
Bu makalada, “Call Stack Tracing” ady bilen hem tanalýan “StackTrace” Java hadysasynyň nähili işleýändigini öwrenersiňiz we düşünersiňiz. Bu maglumatlar, Java Sintaksis 9-njy derejäniň başynda bu düşünje bilen ýüzbe-ýüz bolanlar üçin düzüldi. Meniň pikirimçe , pikiriňiz, tutulmagyňyz ýa -da başga bir zatdygyna garamazdan, IDE-de işlän wagtyňyz hemmäňiz iň bolmanda bir gezek şuňa meňzeş ýalňyşlyklara duş geldiňiz .
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)
Bu, siziň çak edişiňiz ýaly, yzymyzdyr. Panöne howsala düşmäň, indi bu mysaly size bereris. Ilki bilen adynyň görkezişi StackTraceýaly işleýändigine düşünmeli . СтэкBu pursatda birneme has jikme-jik durup geçeris. Stack kolleksiýasynyň işleýşi Sekizinji derejede, siz eýýäm kolleksiýalar bilen tanyşdyňyz we olaryň üç topara bölünendigini bilýärsiňiz Set- set, List- list, Map- sözlük (ýa-da karta). JavaRush (c) laýyklykda . Biziň Stacktoparymyz List. Işleýiş ýörelgesini “Last In First Out ” -y aňladýan LIFO diýip häsiýetlendirip bolar . Elyagny, bu kitaplar toplumyna meňzeş sanaw; ilki bilen goýýan elementimizi almak üçin ilki bilen sanawymyzda goşan elementlerimiziň hemmesini çykarmaly. Aboveokardaky suratda görkezilişi ýaly, mysal üçin sanawdan islendik elementi indeks boýunça alyp boljak adaty sanawdan tapawutlylykda. Güýçlendirmek üçin ýene bir gezek. Bir element almak diňe soňundan mümkindir! Oňa goşulan ilkinji element başynda (ýa-da has amatly bolşy ýaly). Obýektimiziň ulanýan usullary - stakanyň ýokarsyna bir element goşýar. Obýekt - elementiň üstündäki elementi yzyna gaýtaryp berýär. Obýekt - elementiň üstündäki elementi gaýtaryp berýär, ýöne aýyrmaýar. int - ackylda bir element gözleýär. Tapylsa, stakanyň ýokarsyndaky ofset yzyna gaýtarylýar. Otherwiseogsam -1 yzyna gaýtarylýar. boolean - stakanyň boşdygyny barlaýar. Stakanyň boş bolsa hakyky bolýar. Stakada elementler bar bolsa ýalan görkezýär. Onda näme üçin iş prinsiplerine esaslanan biri gerek ? Şeýle ýönekeý programmanyň ýerine ýetirilişinde ýüze çykan ýalňyşlygyň mysalyna seredeliň. StackArrayListСтэкаStackpush()pop()peek()search()empty()JavaStackTraceStack
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;
    }
}
TestIki usully synpymyz bar . Hemmeler tanyş mainwe convertStringToIntmunuň logikasy daşardan alnan setiri (ýagny usuldan main) bitewi görnüşe öwürmek we yzyna gaýtarmakdyr int. Görşüňiz ýaly, belli bir sanly setiriň ýerine parametrden bilgeşleýin geçdik null. Usulymyz bu parametri dogry işläp bilmedi we ýalňyşlyk döretdi NumberFormatException. Bilşiňiz ýaly, programma işini usuldan öwrenip başlaýar we häzirki wagtda işiniň häzirki bahasyny 1-nji belgä goýýan ady bilen maintäzesini döredýär , soň bolsa usula we programma geçýäris. ýerleşýän ýerimiziň parametrlerini öň 2-nji belginiň aşagynda döredilenine girizýär , soň synpda ýerleşýän gözümize görünmeýän usul diýilýär we bu eýýäm biziň 3-nji elementimiz bolar , bu usulda başga bir içerki jaň bolar ýalňyşlyga sebäp boljak elementi barlamak üçin 4 belgä bellemek . Programma, ýalňyşlyk ýüze çykýança geçişlerimiziň ähli zynjyryny görkezýän ýalňyşlygymyzy görkezmeli. Ynha, geçişlerimiziň maglumatlary bilen döredilen biri oňa kömek edýär . СтэкStackTraceconvertStringToIntStackTraceparseIntIntegerStackTraceStackTraceStackTrace
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)
Erroralňyşlyk ýüze çykmazdan ozal programma usullara çuňňur girdi, ýöne ýalňyşlyk ýüze çykan badyna hemme zat ters tertipde bolup başlaýar. Meseläni suratlandyrýan bir setir çap edilýär (mysalda No.1), soň bolsa bize goşulan iň soňky (we ýokarda) baha alynýar, Стэкdört belgili bolup, konsola (mysalda No.2) we meseläniň synpda Integer614 setirde ýüze çykandygyny we şol setiriň parseIntşol bir synp usulynyň 770-nji setiri (mysalda No.3) diýip atlandyrylandygyny görýäris, goşulanda Стэкüç belgili we bu synp usuly, Integerhenizem bize görünmeýän, programmamyzyň 10-njy setirinde ýerleşýän usulymyz bilen çagyryldy convertStringToInt(mysalda No. 4, ikinji gezek goşulanda) we öz gezeginde main6-njy setirde (No. 5 mysal, we goşulanda degişlilikde birinji). Şeýlelik bilen, çagyrylan usullarymyzy ädimme-ädim saklamak bilen , ýalňyşlyga sebäp bolan maglumatlaryň paralel çap edilmegine Стекgaýdyp geldik . mainThisöne StackTracebu diňe ýalňyşlyklar bilen işlemek bilen çäklenmän, anketamyz barada köp gyzykly maglumatlary almaga mümkinçilik berýär. 9-njy derejeli esasy leksiýa teswirlerdäki başga bir meşhur mysala seredeliň. Bizde kod bar we programmanyň işini wizuallaşdyrýan suraty derrew goşaryn:
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 yzy we näme bilen iýilýändigi - 2 Bu ýerde programmamyz öz işini kemsiz ýerine ýetirýär we tamamlanýar. Konsol çykyşynda görjek zadymyz:
getStackTrace
method5
method4
method2
main

Process finished with exit code 0
Bu netijäni nädip aldyk we 20-nji setirden başlap, bäşinji usulda näme boldy? Iň gowusy, ulanyjy Kirilliň teswirlerden leksiýa çenli iň meşhur düşündirişini (gysgaldylan) goşmakdan gorkýaryn . Geliň, döredijilik setirine ýüzleneliň StackTracewe elementi element boýunça analiz edeliň:
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
StackTraceElement[]- massiwiň görnüşini görkezmek (Irki döwürde int [], String [] ýaly massiwler hakda eýýäm öwrenipdiňiz, ine, şol bir zat). stackTraceElements- umumy atlandyryş düzgünlerini göz öňünde tutup, massiwiň ady islendik zat bolup biler, bu işe täsir etmeýär. Thread.currentThread()- yzarlamak isleýän usullarymyzyň ýerine ýetirilýän häzirki sapagyna baglanyşyk almak (häzirlikçe bu möhüm däl, sapaklary Java Core gözleginde 16-njy derejede has jikme-jik analiz edersiňiz) - diýilýän usullaryň getStackTrace()hemmesini alarys Стэк(Munuň üçin yzygiderli giriş StackTrace) Indi döredilen massiwiň bize peýdaly bolup biljekdigini göreliň. Toplumyň ýerine ýetirilen usullar barada maglumatlary saklaýandygyna düşünýäris. (c) Munuň üçin 21-nji setirde üýtgedilen aýlawy başlaýarys ( foraýtsak forEach, bu aýlawy entek öwrenmedikler üçin bu hakda okamagyňyzy maslahat berýärin) we massiwden konsola maglumatlary çykarýarys. , ýagny gurluşygy ulanmak bilen işiň dowamynda haýsy usullaryň ýerine ýetirilendigi barada maglumat element.getMethodName(). Üns beriň, görşümiz ýaly, massiwiň nol elementi degişlilikde ýüze çykdy getStackTrace(), sebäbi maglumatlar massiwini alan pursatynda iň soňky usul ýerine ýetirildi we şeýlelik bilen ýokarsynda gutardy Стэкаwe gurluşygymyzy ýada saldy “ Iň soňunda, ilki bilen ”nol elementiň aşagyndaky massiwde derrew goşulan ilkinji. Ine, başga näme alyp bileris StackTraceElement: Setir getClassName()- Synpyň adyny görkezýär. Setir getMethodName()- Usulyň adyny görkezýär. Setir getFileName()- Faýlyň adyny görkezýär (bir faýlda köp synp bolup biler). Setir getModuleName()- Modulyň adyny görkezýär (null bolup biler). Setir getModuleVersion()- Modulyň wersiýasyny görkezýär (null bolup biler). int getLineNumber()- Usulyň çagyrylan faýlyndaky setir belgisini görkezýär. Indi işiň umumy ýörelgesine düşüneniňizden soň, ideýaňyzda dürli usullary synap görmegiňizi StackTracemaslahat berýärin . Everythinghli zady doly özleşdirmedik bolsaňyzam, öwrenmegi dowam etdiriň we enigma bu meselede meniň üçin bolşy ýaly çykar. Hemmäňize üstünlik arzuw edýärin! Ps Bu materialy halaýan bolsaňyz, şuňa meňzeş goldaw bilen goldaw bermegiňizi haýyş edýäris. Bu siziň üçin kyn däl, men razy. Sag boluň we 41-nji derejede göreris;)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION