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. 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ň Stack
toparymyz 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ň. Stack
ArrayList
Стэка
Stack
push()
pop()
peek()
search()
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
Iki usully synpymyz bar . Hemmeler tanyş main
we convertStringToInt
munuň 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 main
tä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 . Стэк
StackTrace
convertStringToInt
StackTrace
parseInt
Integer
StackTrace
StackTrace
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)
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 Integer
614 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, Integer
henizem 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 main
6-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 . main
Thisöne StackTrace
bu 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());
}
}
}
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ň StackTrace
we 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 ( for
aý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 StackTrace
maslahat 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;)
GO TO FULL VERSION