2010-06-03 5 views
37

में पूर्ण स्टैकट्रेस मुद्रित करने के लिए सवाल सरल है, मैं एक अपवाद से भरा स्टैकट्रेस है कि मैं पर कब्जा पढ़ना चाहते हैं :)कैसे जावा

उदाहरण:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver' 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1136) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) 
at com.azurian.lce.usuarios.ConnectionManager.getConnection(ConnectionManager.java:65) 
at com.azurian.lce.usuarios.db2.UsuarioDAOImpl.autenticar(UsuarioDAOImpl.java:101) 
at com.azurian.lce.usuarios.UsuarioServiceImpl.autenticar(UsuarioServiceImpl.java:31) 
at com.azurian.lce.web.admin.actions.LoginAction.execute(LoginAction.java:49) 
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) 
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) 
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: COM.ibm.db2.jcc.DB2Driver 
at java.net.URLClassLoader$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1130) 
... 23 more 

(मैं पढ़ना चाहते हैं "... 23 अधिक")

सादर :)

+2

Gahhhh ... इतने सारे रन और प्रक्रियाओं और आह्वान और कार्यान्वित और डॉस ... http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns। एचटीएमएल – naiad

+1

देखें: http://stackoverflow.com/questions/1167888/howto-increase-lines-of-java-stack-trace-dump और http://stackoverflow.com/questions/1043378/print-full-call -स्टैक-ऑन-प्रिंटस्टैकट्रैक और http://stackoverflow.com/questions/437756/how-do-i-stop-stacktraces-truncating-in-logs कुछ – akf

+0

हाय सूचीबद्ध करने के लिए! http://people.inf.elte.hu/balopat/bug.html पर मैंने देखा, मैंने आपको जेनरेट किया, सर्कल पर होवर किया, मुझे उम्मीद है कि यह आपको समझने में मदद करेगा कि '... 23 और' मतलब क्या है :) असल में जवाब सही हैं, यह केवल एक उदाहरण है। –

उत्तर

29

जवाब सरल है, उन पंक्तियों को पहले से ही स्टैकट्रेस :)

में हैं
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) 
at com.azurian.lce.usuarios.ConnectionManager.getConnection(ConnectionManager.java:65) 
at com.azurian.lce.usuarios.db2.UsuarioDAOImpl.autenticar(UsuarioDAOImpl.java:101) 
at com.azurian.lce.usuarios.UsuarioServiceImpl.autenticar(UsuarioServiceImpl.java:31) 
at com.azurian.lce.web.admin.actions.LoginAction.execute(LoginAction.java:49) 
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) 
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) 
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Unknown Source) 

असल में, निम्न BasicDataSource#createDataSource() में हो रहा है:

try { 
    Class.forName(driverClassName); // Line 1130 
} catch (ClassNotFoundException e) { 
    throw new SQLNestedException(e, "Cannot load JDBC driver class '" + driverClassName + "'"); // Line 1136 
} 
+1

कैसे परिणाम? [....] – OscarRyz

+0

ठीक है, अब जब एक लंबा समय बीत चुका है, मैंने पढ़ा है कि जवाब बहुत सरल थे, यह एक जार नरक समस्या थी (या इस मामले में डीबी 2 चालक के साथ जार गायब है। इसमें: "के कारण: java.lang.ClassNotFoundException: COM.ibm.db2.jcc.DB2Driver" –

+1

यह मेरे लिए, प्रश्न का उत्तर नहीं देता है। हाँ, ये पंक्तियां पहले से ही स्टैक ट्रेस में हैं, लेकिन वे मुद्रित नहीं हैं! उन्हें प्रिंट करने का सवाल क्या था, जिस पर आपने जवाब नहीं दिया था! – plainOldNerd

24

BalusC सही है। यहाँ देखें: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Throwable.html#printStackTrace()

विशेष रूप से:

नोट वर्ण युक्त लाइनों की उपस्थिति "..."। ये लाइनें संकेत मिलता है कि इस अपवाद के लिए स्टैक ट्रेस के शेष से मेल खाता है अपवाद है कि इस अपवाद ("संलग्न" अपवाद) के कारण हुई थी की स्टैक ट्रेस के नीचे से फ्रेम के संकेत दिया संख्या। यह शॉर्टेंड सामान्य मामले में आउटपुट की लंबाई को बहुत कम कर सकता है जहां एक लिपटे अपवाद "कारक अपवाद" पकड़ा गया है, उसी विधि से फेंक दिया गया है।

BasicDataSource.java लाइन 1136 ClassNotFoundException लाइन 1130 पर फेंक दिया पकड़ लिया और एक SQLNestedException के रूप में यह reraised:

क्या यह आपके उदाहरण में मतलब यह है कि है। इसलिए ClassNotFoundException के लिए स्टैकट्रैक का शेष उपरोक्त SQLNestedException से मेल खाता है और इस संक्षिप्त प्रारूप में स्टैकट्रैक मुद्रित होता है।

7

जब बाहरी अपवाद (SQLNestedException) आंतरिक अपवाद (क्लास नॉटफाउंड एरर) को लपेटता है तो वे एक ही थ्रेड पर होते हैं, और इसलिए उनके स्टैक ट्रेस पर एक सामान्य आधार साझा करते हैं।

(23 और ...) दिखाता है कि आम स्टैक आंतरिक अपवाद के लिए कहां से शुरू होता है, यह वह स्थान भी है जहां बाहरी अपवाद फेंक दिया गया था। इसलिए, जब भी आप देखते हैं (एक्सएक्स और ...), बाकी स्टैक ट्रेस देखने के लिए उपरोक्त अपवाद को देखें।

यदि आप सामान्य निशान के लिए इलिप्सिस के बिना प्रोग्रामेटिक रूप से स्टैकट्रैक प्रिंट करना चाहते हैं, तो आप Throwable.getStackTrace() का उपयोग कर सकते हैं और सभी तत्वों को स्वयं प्रिंट कर सकते हैं।

+0

उत्तर के लिए सभी को धन्यवाद :) यह मुझे बहुत मदद करता है (यह समझने के लिए कि यह प्रोग्राम के साथ क्या हो रहा है) संबंध –

4

इसे आज़माएं। यह तर्क मुख्य अपवाद और इसके सभी कारणों से गुजरता है, जब तक कि कोई और कारण नहीं है (cause == null) प्रक्रिया के लिए छोड़ दिया गया है। इस तरह आप 23 और ... संदेश से बच सकते हैं। मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन मेरा मानना ​​है कि यह आपके लिए काम करना चाहिए।

बीटीडब्ल्यू - लॉगवाइटर एक बफर लेखक है। आप System.out.print या किसी अन्य लॉगिंग API का उपयोग करना चाह सकते हैं।

public static void debugError(final String message, final Throwable th) { 
    final String logMessage = "[ERROR] - " + message; 

    try { 
     logWriter.write(logMessage); 
     logWriter.newLine(); 

     // dump exception stack if specified 
     if (null != th) { 
      final StackTraceElement[] traces = th.getStackTrace(); 
      if (null != traces && traces.length > 0) { 
       logWriter.write(th.getClass() + ": " + th.getMessage()); 
       logWriter.newLine(); 

       for (final StackTraceElement trace : traces) { 
        logWriter.write(" at " + trace.getClassName() + '.' + trace.getMethodName() + '(' + trace.getFileName() + ':' + trace.getLineNumber() + ')'); 
        logWriter.newLine(); 
       } 
      } 

      Throwable cause = th.getCause(); 
      while (null != cause) { 
       final StackTraceElement[] causeTraces = cause.getStackTrace(); 
       if (null != causeTraces && causeTraces.length > 0) { 
        logWriter.write("Caused By:"); 
        logWriter.newLine(); 
        logWriter.write(cause.getClass() + ": " + cause.getMessage()); 
        logWriter.newLine(); 

        for (final StackTraceElement causeTrace : causeTraces) { 
         logWriter.write(" at " + causeTrace.getClassName() + '.' + causeTrace.getMethodName() + '(' + causeTrace.getFileName() + ':' + causeTrace.getLineNumber() + ')'); 
         logWriter.newLine(); 
        } 
       } 

       // fetch next cause 
       cause = cause.getCause(); 
      } 
     } 
    } catch (final IOException ex) { 
     System.err.println(logMessage); 

     if (null != th) { 
      th.printStackTrace(); 
     } 
    } 
} 
+0

आप 'printStackTrace' आउटपुट के माध्यम से पढ़ने के लिए 'रीडर' का उपयोग कर सकते हैं जब तक कि यह _Caused by_ को हिट नहीं करता है, फिर कारण प्राप्त करें और इसके स्टैक ट्रेस को मुद्रित करें (_ द्वारा अगले _Caused की तलाश करें) ... और इस प्रक्रिया को दोबारा दोहराएं अब और अधिक ढेर निशान नहीं है। इस तरह आपको अपना खुद का कस्टम स्टैकट्रैस फॉर्मेटर बनाने की ज़रूरत नहीं है - आप जो पहले से उपलब्ध हैं उसका उपयोग कर सकते हैं:: – ADTC

+0

आपका कोड अच्छी तरह से काम कर रहा है। system.out पर ट्रेस भेजने के लिए, मैं बस 'BufferedWriter logWriter = नया BufferedWriter (नया आउटपुटस्ट्रीमवाइटर (System.out)); ' और अंत में: ' logWriter.flush();' – Ben