JavaRush /جاوا بلاگ /Random-SD /اسٽيڪ ٽريس ۽ ان سان گڏ کائي ويندي آهي
Alukard
سطح
London

اسٽيڪ ٽريس ۽ ان سان گڏ کائي ويندي آهي

گروپ ۾ شايع ٿيل
هن آرٽيڪل ۾، توهان سکندا ۽ سمجھندا ته ڪيئن جاوا رجحان StackTrace، پڻ سڃاتو وڃي ٿو ڪال اسٽيڪ ٽريڪنگ، ڪم ڪري ٿو. اها معلومات نئين سکندڙن لاءِ ترتيب ڏني وئي آهي جن کي جاوا سنٽيڪس ليول 9 جي شروعات ۾ هن تصور جو سامنا ٿيو. منهنجو خيال آهي ته توهان سڀني کي، گهٽ ۾ گهٽ هڪ ڀيرو، توهان جي IDE ۾ ڪم ڪرڻ وقت ساڳين غلطين جو سامنا ڪيو آهي، قطع نظر ته اهو Idea ، Eclipse يا ٻيو ڪجهه هو.
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)
هي، جيئن توهان اندازو ڪيو هوندو، اسان جي ٽريڪنگ آهي. پر گھٻرائڻ ۾ جلدي نه ڪريو، ھاڻي اسان توھان لاءِ ھن مثال کي ٽوڙينداسين. پهرين توهان کي حقيقت کي سمجهڻ جي ضرورت آهي ته اهو StackTraceڪم ڪري ٿو جيئن Стэкهن جو نالو مشورو ڏئي ٿو. هن نقطي تي اسان ٿورو وڌيڪ تفصيل ۾ رهندا. اسٽيڪ گڏ ڪرڻ ڪيئن ڪم ڪندو آهي اٺين سطح تي، توهان اڳ ۾ ئي مجموعن سان واقف ٿي چڪا آهيو ۽ ڄاڻو ٿا ته اهي ٽن گروپن ۾ ورهايل آهن Set- سيٽ، List- فهرست، Map- لغت (يا نقشو). JavaRush جي مطابق (c). اسان جي Stackگروپ جو حصو آهي List. ان جي آپريشن جو اصول LIFO جي طور تي بيان ڪري سگھجي ٿو ، جيڪو بيٺو آھي Last In First Out. يعني، هيءَ فهرست ڪتابن جي اسٽيڪ وانگر آهي؛ جنهن عنصر کي اسين پهرين ۾ رکون ٿا، ان کي کڻڻ لاءِ Stack، اسان کي پهريان انهن سڀني عنصرن کي ڪڍڻو پوندو، جن کي اسان پنهنجي فهرست ۾ شامل ڪيو. جيئن مٿي ڏنل تصوير ۾ اشارو ڪيو ويو آهي، برعڪس، مثال طور، هڪ باقاعده فهرست ArrayListجتي اسان فهرست مان ڪنهن به عنصر کي انڊيڪس ذريعي حاصل ڪري سگهون ٿا. هڪ ڀيرو ٻيهر مضبوط ڪرڻ لاء. مان هڪ عنصر حاصل ڪرڻ Стэкаصرف آخر کان ممڪن آهي! جڏهن ته پهريون عنصر ان ۾ شامل ڪيو ويو آهي شروعات ۾ (يا تري ۾، جيئن وڌيڪ آسان آهي). اهي طريقا آهن اسان جي Stack Object وٽ push()- هڪ عنصر شامل ڪري ٿو اسٽيڪ جي چوٽي تي. اعتراض pop()- اسٽيڪ جي چوٽي تي عنصر کي واپس ڪري ٿو، ان کي پروسيس ۾ هٽائڻ. اعتراض peek()- عنصر کي اسٽيڪ جي چوٽي تي موٽائي ٿو، پر ان کي ختم نٿو ڪري. int search()- اسٽيڪ تي هڪ عنصر ڳولي ٿو. جيڪڏهن مليو ته، ان جو آفسٽ اسٽيڪ جي چوٽيءَ تان واپس ڪيو ويندو. ٻي صورت ۾ -1 موٽيو آهي. boolean 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ٻن طريقن سان. هرڪو واقف آهي main۽ convertStringToIntان جو منطق اهو آهي ته ٻاهران حاصل ڪيل هڪ تار کي تبديل ڪرڻ ۽ واپس ڪرڻ (يعني طريقي کان main) قسم جي انٽيجر نمبر ۾ int. جئين توهان ڏسي سگهو ٿا، اسان ارادي طور تي ڪجهه نمبر سان اسٽرنگ جي بدران پيٽرولر کي منظور ڪيو null. اسان جو طريقو هن پيٽرولر کي صحيح طريقي سان پروسيس نه ڪري سگهيو ۽ هڪ غلطي جو سبب بڻيو NumberFormatException. جيئن ته توهان کي خبر آهي ته، پروگرام پنهنجي ڪم کي طريقي سان ڪم ڪرڻ شروع ڪري ٿو main۽ هن وقت اهو هڪ نئين Стэкنالي سان ٺاهيندو آهي StackTraceجتي اهو پنهنجي ڪم جي موجوده قيمت کي نمبر 1 هيٺ رکي ٿو ، ان کان پوء اسان طريقي convertStringToInt۽ پروگرام ڏانهن وڃون ٿا. اسان جي جڳھ جا پيرا ميٽرز داخل ڪري ٿو ھڪڙي ھڪڙي ۾ جيڪو اڳ ۾ StackTraceنمبر 2 جي تحت ٺاھيو ويو آھي ، پوء اھو طريقو سڏيو ويندو آھي جيڪو parseIntڪلاس ۾ موجود اسان جي اکين کان پوشیدہ آھي Integer۽ اھو اڳ ۾ ئي اسان جو عنصر نمبر 3StackTrace ھوندو، ھن طريقي ۾ ھڪڙو ٻيو اندروني ڪال شامل ڪيو ويندو. StackTraceنمبر 4 ڏانهن عنصر چيڪ ڪرڻ لاءِ null لاءِ جيڪو هڪ غلطي جي اڳواڻي ڪندو. پروگرام کي اسان جي غلطي کي ظاهر ڪرڻ جي ضرورت آهي جيڪا اسان جي منتقلي جي پوري زنجير کي ظاهر ڪندي جيستائين غلطي ٿي. هي اهو آهي جتي اسان جي منتقلي جي ڊيٽا سان گڏ اڳ ۾ ٺاهي وئي آهي هن جي مدد لاء 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)
غلطي ٿيڻ کان اڳ، پروگرام طريقن ۾ گھيرو ٿي ويو، پر جيئن ئي غلطي ٿيندي، سڀ ڪجھ ريورس آرڊر ۾ ٿيڻ شروع ٿئي ٿو. مسئلو بيان ڪرڻ واري لائن پرنٽ ڪئي وئي آهي (مثال ۾ نمبر 1)، پوءِ اسان جي لاءِ شامل ڪيل آخري (۽ مٿي تي) قيمت ورتي وئي آهي، Стэкاها نمبر چار هئي ۽ ڪنسول تي ڇپيل آهي (مثال ۾ نمبر 2) ۽ اسان ڏسون ٿا ته مسئلو ڪلاس ۾ Integer614 لائن آف ڪوڊ تي پيدا ٿيو ۽ هن لائن کي سڏيو ويو، ساڳئي ڪلاس جي طريقي جي 770 لائن parseInt(مثال ۾ نمبر 3) جنهن ۾، جڏهن شامل ڪيو ويو، Стэкنمبر ٽيون ۽ هي طبقي طريقو، Integerاڃا تائين اسان کي نظر نه آيو آهي، اسان جي پروگرام جي 10 لائن تي واقع اسان جي طريقي سان سڏيو ويو (مثال طور نمبر 4، ۽ جڏهن شامل ڪيو ويو ته ٻيو هو)، ۽ ان جي بدلي ۾، لائن 6 (نمبر 5 ۾) تي convertStringToIntسڏيو ويو. mainمثال، ۽ جڏهن شامل ڪيو وڃي، ترتيب سان، پهريون). Стекان ڪري، اسان جي سڏجي ويل طريقن کي قدم سان گڏ رکڻ سان ، اسان mainمعلومات جي متوازي ڇپائيءَ ڏانهن واپس موٽڻ جي قابل ٿي ويا هئاسين جيڪا اسان کي غلطي ڏانهن وٺي وئي. پر StackTraceاهو نه رڳو غلطين سان ڪم ڪري رهيو آهي، اهو اسان کي اسان جي درخواست جي عمل بابت تمام گهڻي دلچسپ معلومات حاصل ڪرڻ جي اجازت ڏئي ٿو. اچو ته ليول 9 جي مکيه ليڪچر جي تبصرن ۾ هڪ ٻيو مشهور مثال ڏسو. اسان وٽ ڪوڊ آهي ۽ مان ان سان فوري طور تي هڪ تصوير ڳنڍيندس جيڪا پروگرام جي عمل کي ڏسڻ ۾ اچي ٿي.
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());
        }
    }
}
اسٽيڪ ٽريس ۽ ان سان ڇا کائي وڃي ٿو - 2 هتي اسان جو پروگرام پنهنجو ڪم بي عيب ۽ ختم ڪري ٿو. اھو اھو آھي جيڪو اسان ڏسندا سين ڪنسول ٻاھر ۾:
getStackTrace
method5
method4
method2
main

Process finished with exit code 0
اسان اهو نتيجو ڪيئن حاصل ڪيو ۽ پنجين طريقي ۾ ڇا ٿيو، لائن 20 کان شروع ٿي؟ مون کي ڊپ آهي ته مان جيڪو ڪري سگهان ٿو اهو سڀ کان وڌيڪ مشهور تشريح (مختصر) استعمال ڪندڙ ڪريل جي تبصرن کان وٺي ليڪچر تائين شامل ڪرڻ آهي. اچو ته ٺاھڻ واري لڪير ڏانھن ڦيرايو StackTrace۽ ان کي عنصر طرفان عنصر جو تجزيو ڪيو:
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
StackTraceElement[]- صف جي قسم جو اشارو (ابتدائي سطحن تي توھان اڳ ۾ ئي ڄاڻايو آھي صفن جي باري ۾ جيئن int[], String[]، ھتي اھو ساڳيو آھي). stackTraceElements- صف جو نالو ڪجھ به ٿي سگھي ٿو، عام نالو ڏيڻ جي ضابطن کي مدنظر رکندي، اھو ڪم تي اثر انداز نٿو ڪري. Thread.currentThread()- موجوده سلسلي جي لنڪ حاصل ڪرڻ جنهن ۾ جيڪي طريقا اسان ٽريڪ ڪرڻ چاهيون ٿا انهن تي عمل ڪيو ويو آهي (هاڻي اهو اهم ناهي، توهان جاوا ڪور جي ڳولا ۾ ليول 16 تي وڌيڪ تفصيل سان ٿريڊن جو تجزيو ڪندا) getStackTrace()- اسان سڀ طريقا حاصل ڪريون ٿا Стэкجيڪي سڏيو ويندو آهي. (هيءَ لاءِ هڪ باقاعده حاصل ڪندڙ آهي StackTrace) هاڻي اچو ته ڏسون ته ڇا ٺاهيل صف اسان لاءِ ڪارائتو ٿي سگهي ٿي. اسان سمجھون ٿا ته سرن تي عمل ٿيل طريقن بابت معلومات محفوظ ڪري ٿي. (c) ۽ ان لاءِ، 21 هين لڪير ۾، اسان هڪ تبديل ٿيل چڪر شروع ڪريون ٿا forجنهن کي سڏيو ويندو آهي forEach(رستي سان، انهن لاءِ جن اڃا تائين هن چڪر جو اڀياس نه ڪيو آهي، مان توهان کي ان بابت پڙهڻ جي صلاح ڏيان ٿو) ۽ ڊيٽا کي صف کان ڪنسول تائين پهچايو. , يعني معلومات جنهن جي باري ۾ طريقن جي تعمير دوران استعمال ڪيو ويو ڪم دوران element.getMethodName(). ڌيان، جيئن اسان ڏسون ٿا، صف جو صفر عنصر پاڻ کي، ترتيب سان ظاهر ڪيو ويو آهي getStackTrace()، ڇاڪاڻ ته ڊيٽا جي صف حاصل ڪرڻ جي وقت تي اهو آخري طريقو هو جيڪو عمل ڪيو ويو ۽ انهي سان گڏ مٿي تي ختم ٿي ويو Стэка، ۽ اسان جي تعمير کي ياد ڪندي " Last in, first out "فوري طور تي پهريون آهي جيڪو صف ۾ شامل ڪيو وڃي صفر عنصر جي تحت. ھتي آھي ٻيو ڇا اسان مان حاصل ڪري سگھون ٿا StackTraceElement: String getClassName()- ڪلاس جو نالو واپس ڪري ٿو. اسٽرنگ getMethodName()- طريقي جو نالو موٽائي ٿو. اسٽرنگ getFileName()- فائل جو نالو واپس ڏئي ٿو (هڪ فائل ۾ ڪيترائي ڪلاس ٿي سگهن ٿا). اسٽرنگ getModuleName()- موٽائي ٿو ماڊل جو نالو (نال ٿي سگھي ٿو). اسٽرنگ getModuleVersion()- موٽائي ٿو ماڊل ورزن (نال ٿي سگھي ٿو). int getLineNumber()- فائل ۾ لائن نمبر واپس ڪري ٿو جنهن ۾ طريقو سڏيو ويو هو. هاڻي ته توهان آپريشن جي عام اصول کي سمجهي رهيا آهيو، مان توهان کي صلاح ڏيان ٿو ته توهان پنهنجي IdeStackTrace ۾ مختلف طريقن جي ڪوشش ڪريو . جيتوڻيڪ توهان مڪمل طور تي هر شي ۾ مهارت حاصل نه ڪئي آهي، سکڻ جاري رکو ۽ پزل ساڳيو ئي ڦري ويندو جيڪو هن معاملي ۾ مون لاء نڪتو. مان توهان سڀني جي ڪاميابي جي خواهش! Ps جيڪڏھن توھان ھي مواد پسند ڪيو، مھرباني ڪري ان کي پسند ڪرڻ سان سپورٽ ڪريو. اهو توهان لاء ڏکيو ناهي، مان خوش آهيان. مهرباني ۽ توهان کي سطح 41 تي ڏسو؛)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION