JavaRush /Blog Jawa /Random-JV /Stack Trace lan apa sing dipangan
Alukard
tingkat
London

Stack Trace lan apa sing dipangan

Diterbitake ing grup
Ing artikel iki, sampeyan bakal sinau lan ngerti carane fenomena Java StackTrace, uga dikenal minangka Call Stack Tracing, bisa digunakake. Informasi iki wis disusun kanggo pamula sing nemoni konsep iki ing wiwitan Sintaksis Jawa Level 9. Aku kabeh sampeyan, paling sapisan, wis nemokke kesalahan padha nalika digunakake ing IDE Panjenengan, preduli saka apa iku Idea , Eclipse utawa mergo.
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)
Iki, kaya sing wis sampeyan duga, iki minangka jejak kita. Nanging aja cepet-cepet gupuh, saiki kita bakal ngilangi conto iki kanggo sampeyan. Pisanan sampeyan kudu ngerti kasunyatan sing StackTracekerjane kaya Стэкjenenge. Ing titik iki kita bakal manggon ing sethitik liyane rinci. Carane koleksi Stack dianggo Ing tingkat kawolu, sampeyan wis dadi kenalan karo koleksi lan ngerti sing padha dipérang dadi telung klompok Set- nyetel, List- dhaftar, Map- kamus (utawa peta). Miturut JavaRush (c). Kita Stackminangka bagéan saka grup List. Prinsip operasi bisa diterangake minangka LIFO , sing tegese Last In First Out. Yaiku, iki minangka dhaptar sing padha karo tumpukan buku; kanggo njupuk unsur sing dilebokake dhisik Stack, kita kudu ngekstrak kabeh unsur sing ditambahake ing dhaptar kasebut. Kaya sing dituduhake ing gambar ing ndhuwur, ora kaya, contone, dhaptar biasa ArrayListsing bisa entuk unsur apa wae saka dhaptar kanthi indeks. Sepisan maneh kanggo penguatan. Njupuk unsur saka Стэкаmung bisa saka mburi! Nalika unsur pisanan ditambahake ing wiwitan (utawa ing ngisor, minangka luwih trep). Iki minangka metode sing diduweni Stack Obyek push()- Nambahake unsur ing ndhuwur tumpukan. Obyek pop()- Ngasilake unsur ing ndhuwur tumpukan, njabut ing proses. Obyek peek()- Ngasilake unsur ing ndhuwur tumpukan, nanging ora mbusak. int search()- Nggoleki unsur ing tumpukan. Yen ditemokake, offset saka ndhuwur tumpukan bakal bali. Yen ora -1 bali. boolean empty()- Priksa yen tumpukan kosong. Ngasilake bener yen tumpukan kosong. Ngasilake palsu yen tumpukan ngemot unsur. Dadi kenapa sampeyan Javakudu StackTracedibangun ing prinsip operasi Stack? Ayo goleki conto kesalahan ing ngisor iki sing kedadeyan sajrone eksekusi program sing prasaja kasebut.
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;
    }
}
Kita duwe kelas Testkanthi rong cara. Saben uwong wis kenal mainlan convertStringToIntlogikane yaiku ngowahi lan ngasilake senar sing ditampa saka njaba (yaiku saka metode main) dadi nomer integer saka jinis int. Kaya sing sampeyan ngerteni, kita sengaja ngliwati parameter kasebut tinimbang senar kanthi sawetara nomer null. Cara kita ora bisa ngolah parameter iki kanthi bener lan nyebabake kesalahan NumberFormatException. Kaya sing sampeyan ngerteni, program kasebut wiwit nindakake pakaryan saka metode kasebut mainlan saiki nggawe sing anyar Стэкkanthi jeneng StackTracesing menehi nilai saiki karya ing nomer 1 , banjur pindhah menyang metode convertStringToIntlan program maneh. nglebokake paramèter lokasi kita menyang sing digawe sadurunge StackTraceing nomer 2 , banjur diarani metode sing ora katon ing mripat kita parseIntsing ana ing kelas Integerlan iki bakal dadi unsur nomer 3 kita StackTrace, ing metode iki bakal ana telpon internal liyane sing ditambahake. kanggo StackTracenomer 4 kanggo mriksa unsur kanggo null kang bakal mimpin kanggo kesalahan. Program kasebut kudu nampilake kesalahan sing nuduhake kabeh rantai transisi nganti ana kesalahan. Iki ngendi sing sadurunge digawe karo data transisi kita teka kanggo bantuan dheweke 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)
Sadurunge ana kesalahan, program kasebut dadi jero menyang metode, nanging sanalika kesalahan kedadeyan, kabeh bakal kedadeyan ing urutan mbalikke. A baris njlentrehke masalah wis dicithak (No. 1 ing conto), banjur pungkasan (lan ing ndhuwur) Nilai ditambahaké kanggo kita dijupuk, Стэкiku nomer papat lan dicithak kanggo console (No. 2 ing conto) lan kita waca sing masalah njedhul ing kelas Integering 614 baris kode lan disebut baris iki, baris 770 saka cara parseIntsaka kelas padha (No. 3 ing conto) kang, nalika ditambahake, Стэкana nomer telu lan cara kelas iki. Integerisih ora katon kanggo kita, iki wis disebut dening cara kita convertStringToIntdumunung ing baris 10 program kita (No. 4 ing conto, lan nalika nambah iku kaloro), lan iku, ing siji, diarani maining baris 6 (No. 5). ing conto, lan nalika nambah, mungguh, pisanan). Dadi, kanthi nyimpen Стекcara sing diarani langkah demi langkah, kita bisa bali menyang mainprinting informasi paralel sing persis nyebabake kesalahan kasebut. Nanging StackTraceiki ora mung nggarap kesalahan, nanging ngidini kita entuk akeh informasi sing menarik babagan proses aplikasi kita. Ayo goleki conto populer liyane ing komentar ing kuliah utama tingkat 9. Kita duwe kode lan aku bakal langsung masang gambar sing nggambarake proses program kasebut:
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());
        }
    }
}
Tumpukan Trace lan apa sing dipangan karo - 2 Ing kene program kita nindakake tugas kanthi sampurna lan rampung. Iki sing bakal kita deleng ing output konsol:
getStackTrace
method5
method4
method2
main

Process finished with exit code 0
Kepiye carane entuk kesimpulan iki lan apa sing kedadeyan ing metode kaping lima, wiwit saka baris 20? Aku wedi sing paling apik sing bisa ditindakake yaiku nambah panjelasan sing paling populer (disingkat) dening pangguna Kirill saka komentar menyang kuliah. Ayo pindhah menyang baris nggawe StackTracelan nganalisa unsur kanthi unsur:
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
StackTraceElement[]- indikasi jinis array (Ing tingkat awal sampeyan wis sinau babagan array kaya int [], String [], ing kene padha). stackTraceElements- jeneng Uploaded bisa apa wae, njupuk menyang akun aturan jeneng umum, iki ora mengaruhi karya. Thread.currentThread()- entuk link menyang utas saiki sing cara sing pengin dilacak dieksekusi (saiki ora penting, sampeyan bakal nganalisa thread kanthi luwih rinci ing level 16 ing pencarian Java Core) getStackTrace()- entuk kabeh Стэкmetode sing diarani ( Iki minangka getter biasa kanggo StackTrace) Saiki ayo ndeleng apa array sing digawe bisa migunani kanggo kita. Kita ngerti manawa array nyimpen informasi babagan cara sing dieksekusi. (c) Lan kanggo iki, ing baris 21, kita miwiti siklus sing diowahi forsing diarani forEach(kanthi cara, kanggo sing durung sinau siklus iki, aku menehi saran supaya maca babagan iki) lan data output saka array menyang konsol, yaiku informasi babagan cara sing ditindakake sajrone karya kanthi nggunakake konstruksi element.getMethodName(). Manungsa waé, kaya sing kita deleng, unsur nol saka array kasebut dadi dhewe getStackTrace(), amarga nalika nampa array data minangka cara pungkasan sing ditindakake lan rampung ing ndhuwur Стэка, lan ngelingi konstruksi kita " Last in, first out ” iku langsung sing pisanan ditambahake menyang array ing sangisore unsur nol. Mangkene apa maneh sing bisa dipikolehi StackTraceElement: String getClassName()- Ngasilake jeneng kelas. String getMethodName()- Ngasilake jeneng metode. String getFileName()- Ngasilake jeneng berkas (bisa ana akeh kelas ing siji file). String getModuleName()- Ngasilake jeneng modul (bisa null). String getModuleVersion()- Ngasilake versi modul (bisa null). int getLineNumber()- Ngasilake nomer baris ing file sing diarani metode kasebut. Saiki sampeyan ngerti prinsip operasi umum, aku menehi saran supaya sampeyan nyoba macem-macem cara dhewe StackTraceing Ide sampeyan . Sanajan sampeyan durung nguwasani kabeh, terus sinau lan teka-teki bakal katon kaya aku ing perkara iki. Aku pengin sampeyan kabeh sukses! Ps Yen sampeyan seneng karo materi iki, dukung karo like. Ora angel kanggo sampeyan, aku seneng. Matur nuwun lan ketemu sampeyan ing level 41;)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION