जावा में प्रिंटस्टैकट्रेस () पद्धति का उपयोग क्या है?


97

मैं एक सॉकेट प्रोग्राम से गुजर रहा हूं। इसमें, कैच ब्लॉक में ऑब्जेक्ट printStackTraceपर कॉल किया जाता है IOException। वास्तव में
क्या करता printStackTrace()है?

catch(IOException ioe)
{
    ioe.printStackTrace();
}

मैं इसके उद्देश्य से अनजान हूँ। इसका क्या उपयोग है?


47
आधुनिक आईडीई में सबसे शक्तिशाली विशेषताओं में से एक दी गई जावा विधि के लिए प्रलेखन (जिसे जादवॉक कहा जाता है) देखने की क्षमता है। ग्रहण में यह Shift-F2 है जब कर्सर को प्रिंटस्टैकट्रेस विधि नाम पर रखा जाता है।
Thorbjørn रावन एंडरसन

2
लगता है कि आप जावा के लिए नए हैं। यहाँ कुछ पढ़ने के लिए है: Today.java.net/article/2006/04/04/…
TJR

आप यह देखने के लिए कि यह क्या करता है और कैसे करता है, यह देखने के लिए आप PrintStackTrace () का कोड पढ़ सकते हैं।
पीटर लॉरी

1
मैं अक्सर पकड़ ब्लॉक के अंदर इस पैटर्न को देखता हूं: e.printStackTrace(); System.exit(1); यहां मैं ओपी के रूप में एक ही सवाल पूछना चाहता हूं, लेकिन एक अलग नस में: वास्तव में इसका उद्देश्य क्या है? क्या JRE स्वचालित रूप से स्टैकट्रेस और एक्जिट प्रिंट नहीं करेगा, जब अपवाद फेंक दिया जाता है? यानी, वास्तव में बहुत "एक्सेप्शन हैंडलिंग" यहाँ नहीं चल रहा है, है ना ??
ओवेन

1
यह भी आम तौर पर एक है बहुत बुरा विचार , के रूप में यह अपवाद को दबा - दुर्भाग्य से यह क्या ग्रहण और अन्य IDEs अक्सर कैच ब्लॉक के लिए शरीर के रूप में स्वतः-सुझाव है, तो यह प्रयोग किया जाता है अब तक अधिक बार की तुलना में यह होना चाहिए।
dimo414

जवाबों:


99

यह Exceptionउदाहरणों पर एक विधि है जो उदाहरण के स्टैक ट्रेस को प्रिंट करता हैSystem.err

यह एक अपवाद का निदान करने के लिए एक बहुत ही सरल, लेकिन बहुत उपयोगी उपकरण है। यह बताता है कि कोड में क्या हुआ और कहां हुआ।

यहां इसका एक उदाहरण दिया गया है कि इसे व्यवहार में कैसे इस्तेमाल किया जा सकता है:

try {
    // ...
} catch (SomeException e) { 
    e.printStackTrace();
}

2
और जाँच के अपवादों के लिए धन्यवाद शायद यह catchब्लॉक की # 1 सामग्री है :-)
जॉय

3
@ जोये याthrow new RuntimeException(e)
बार्ट वैन ह्युकेलोम

3
हालाँकि, इसे बुरा व्यवहार माना जाता है क्योंकि यह थ्रेडसेफ़ नहीं है। लकड़हारा बयान का उपयोग करें और इसे वहां शामिल करें।
करिद्राग्ने

40

मैं इसके बारे में बहुत उत्सुक था, इसलिए मैंने बस एक छोटा सा नमूना कोड एक साथ रखा जहाँ आप देख सकते हैं कि यह क्या कर रहा है:

try {
    throw new NullPointerException();
}
catch (NullPointerException e) {
    System.out.println(e);
}

try {
    throw new IOException();
}
catch (IOException e) {
    e.printStackTrace();
}
System.exit(0);

कॉलिंग println(e):

java.lang.NullPointerException

कॉलिंग e.printStackTrace():

java.io.IOException
      at package.Test.main(Test.java:74)

यह सामान्य है, 1 के साथ आप त्रुटि के toString () को कॉल करते हैं, और 2 में आप त्रुटि से सभी स्टैकट्रेस प्रिंट करने के लिए कहते हैं। यह 2 अलग चीजें हैं।
जॉन

1
System.err.println(e);अधिक उचित होगा।
रोटट्रेलर

14

यह अपवाद का पता लगाने में मदद करता है। उदाहरण के लिए आप अपने प्रोग्राम में कुछ तरीके लिख रहे हैं और आपका एक तरीका बग का कारण बनता है। फिर प्रिंटस्टैक आपको यह पहचानने में मदद करेगा कि कौन सी विधि बग का कारण बनती है। स्टैक इस तरह से मदद करेगा:

पहले आपकी मुख्य विधि को कॉल किया जाएगा और स्टैक में डाला जाएगा, फिर दूसरी विधि को कॉल किया जाएगा और LIFO ऑर्डर में स्टैक में डाला जाएगा और यदि कोई त्रुटि किसी भी विधि के अंदर कहीं होती है तो यह स्टैक उस विधि को पहचानने में मदद करेगा।


11

printStackTrace()प्रोग्रामर को यह समझने में मदद करता है कि वास्तविक समस्या कहां हुई। पैकेज printStacktrace()के वर्ग Throwableकी एक विधि है java.lang। यह आउटपुट कंसोल में कई लाइनें प्रिंट करता है। पहली पंक्ति में कई तार होते हैं। इसमें थ्रोएबल सब-क्लास और पैकेज की जानकारी का नाम है। दूसरी पंक्ति से आगे, यह त्रुटि स्थिति / लाइन संख्या के साथ शुरुआत का वर्णन करता है at

अंतिम पंक्ति हमेशा त्रुटि / अपवाद से प्रभावित गंतव्य का वर्णन करती है। दूसरी आखिरी पंक्ति हमें स्टैक में अगली पंक्ति के बारे में सूचित करती है जहां नियंत्रण अंतिम पंक्ति में वर्णित लाइन संख्या से स्थानांतरण प्राप्त करने के बाद जाता है। त्रुटियां / अपवाद आउटपुट को स्टैक के रूप में प्रस्तुत करते हैं, जिन्हें स्टैक fillInStackTrace()में Throwableक्लास विधि द्वारा खिलाया गया था , जो प्रोग्राम कंट्रोल ट्रांसफर डिटेल्स में ही एक्जीक्यूशन स्टैक में भरता है। के साथ शुरू होने वाली रेखाएं at, निष्पादन स्टैक के मूल्यों के अलावा कुछ भी नहीं हैं। इस तरह प्रोग्रामर समझ सकता है कि कोड में वास्तविक समस्या कहां है।

printStackTrace()विधि के साथ , यह उपयोग करने के लिए एक अच्छा विचार है e.getmessage()


6

printStackTrace()स्रोत कोड में अपवाद वाले स्थानों को प्रिंट करता है, इस प्रकार उस लेखक को अनुमति देता है जिसने प्रोग्राम को यह देखने के लिए लिखा है कि क्या गलत हुआ। लेकिन चूंकि यह स्रोत कोड में समस्याएं दिखाता है, उपयोगकर्ता (ओं) जिनके पास कोई कोडिंग अनुभव हो सकता है या नहीं हो सकता है वे समझ नहीं पा रहे हैं कि क्या गलत हुआ, इसलिए यदि प्रोग्राम उपयोगकर्ता को लेखकों को त्रुटि संदेश भेजने की अनुमति देता है। उपयोगकर्ता गलत होने पर अच्छा डेटा देने में सक्षम नहीं हो सकते हैं।

आपको Logger.getLogger()विधि पर विचार करना चाहिए , यह एक बेहतर अपवाद हैंडलिंग (लॉगिंग) सुविधा प्रदान करता है, और इसके अलावा printStackTrace()बिना तर्क के अप्रचलित माना जाता है और केवल डिबगिंग उद्देश्यों के लिए उपयोग किया जाना चाहिए, उपयोगकर्ता प्रदर्शन के लिए नहीं।


2

printStackTrace()मदद करता है प्रोग्रामर को समझने जहां वास्तविक समस्या उत्पन्न हुई। printStackTrace()विधि वर्ग का एक सदस्य है Throwableमें java.langपैकेज।


2

printStackTraceThrowableकक्षा की एक विधि है । यह विधि कंसोल में त्रुटि संदेश प्रदर्शित करती है; जहाँ हमें स्रोत कोड में अपवाद मिल रहा है। इन विधियों का उपयोग कैच ब्लॉक के साथ किया जा सकता है और वे वर्णन करते हैं:

  1. अपवाद का नाम।
  2. अपवाद का वर्णन।
  3. स्रोत कोड में अपवाद का स्थान।

कंसोल पर अपवाद का वर्णन करने वाले तीन तरीके (जिसमें प्रिंटस्टैकट्रेस उनमें से एक है) हैं:

  1. printStackTrace()
  2. toString()
  3. getMessage()

उदाहरण:

public class BabluGope {
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
         } catch (ArithmeticException e) {
             e.printStackTrace();   
             // System.err.println(e.toString());
             //System.err.println(e.getMessage());  
         }
    }
}

1

PrintStackTrace () प्रोग्रामर को यह समझने में मदद करता है कि वास्तविक समस्या कहां हुई थी। यह अपवाद का पता लगाने में मदद करता है। यह प्रत्येक अपवाद वर्ग द्वारा विरासत में मिली थ्रोबेबल क्लास का प्रिंटस्टैकट्रेस () विधि है। यह विधि ई ऑब्जेक्ट के एक ही संदेश को प्रिंट करती है और लाइन नंबर भी जहां अपवाद हुआ।

निम्नलिखित जावा में एक्सेप्शन के प्रिंट स्टैक का एक और उदाहरण है।

public class Demo {
   public static void main(String[] args) {
      try {
         ExceptionFunc();
      } catch(Throwable e) {
         e.printStackTrace();
      }
   }
   public static void ExceptionFunc() throws Throwable {
      Throwable t = new Throwable("This is new Exception in Java...");

      StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
      };
      t.setStackTrace(trace);
      throw t;
   }
}

java.lang.Throwable: यह Java में नया अपवाद है ... ClassName.methodName (fileName): 5


0

जावा में e.printStackTrace () विधि का उपयोग क्या है?

खैर, इस पद्धति का उपयोग करने का उद्देश्य यह e.printStackTrace();देखना है कि वास्तव में क्या गलत है।

उदाहरण के लिए, हम एक अपवाद को संभालना चाहते हैं। आइए निम्नलिखित उदाहरण पर एक नज़र डालें।

public class Main{

  public static void main(String[] args) {

    int a = 12;
    int b = 2;

    try {
       int result = a / (b - 2);
       System.out.println(result);
    }

    catch (Exception e)
    {
       System.out.println("Error: " + e.getMessage());
       e.printStackTrace();
    }
  }
}

मैंने e.printStackTrace();सही गलत दिखाने के लिए विधि का उपयोग किया है।

आउटपुट में, हम निम्नलिखित परिणाम देख सकते हैं।

Error: / by zero

java.lang.ArithmeticException: / by zero

  at Main.main(Main.java:10)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

-1

यहां देखें छवि

printStackTrace() यह बताता है कि आपको किस लाइन में त्रुटि हो रही है और आपको त्रुटि क्यों हो रही है।

उदाहरण:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.