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 StackTrace
gumagana ito tulad ng Стэк
iminumungkahi ng pangalan nito. Sa puntong ito ay tatalakayin natin nang mas detalyado. 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 Stack
ay 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 ArrayList
kung 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 Java
kailangan mo StackTrace
ng 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 Test
na may dalawang pamamaraan. Ang lahat ay pamilyar main
at convertStringToInt
ang 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 main
at sa sandaling ito ay lumilikha ito ng bago Стэк
na may pangalan StackTrace
kung saan inilalagay nito ang kasalukuyang halaga ng trabaho nito sa ilalim ng numero 1 , pagkatapos ay pumunta kami sa pamamaraan convertStringToInt
at sa programa muli ipinapasok ang mga parameter ng aming lokasyon sa isa na ginawa nang mas maaga StackTrace
sa ilalim ng numero 2 , pagkatapos ito ay tinatawag na isang pamamaraan na hindi nakikita ng aming mga mata parseInt
na matatagpuan sa klase Integer
at ito ay magiging elemento bilang 3 namin StackTrace
, sa paraang ito ay magkakaroon ng isa pang panloob na tawag na idaragdag sa StackTrace
numero 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 Integer
sa 614 na linya ng code at tinawag ang linyang ito, linya 770 ng isang pamamaraan parseInt
ng parehong klase (No. 3 sa halimbawa) na, kapag idinagdag sa, Стэк
ay numero ng tatlo at ang pamamaraan ng klase na ito, Integer
hindi pa rin nakikita sa amin, ay tinawag sa pamamagitan ng aming pamamaraan convertStringToInt
na matatagpuan sa linya 10 ng aming programa (No. 4 sa halimbawa, at kapag idinagdag ito ay pangalawa), at ito naman, ay tinawag main
sa 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 main
parallel na pag-print ng impormasyon na eksaktong humantong sa amin sa error. Ngunit StackTrace
hindi 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());
}
}
}
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 StackTrace
at 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 for
na 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 StackTrace
sa 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 ;)
GO TO FULL VERSION