सरल शब्दों में, स्टैक ट्रेस उस विधि कॉल की एक सूची है जो अनुप्रयोग के बीच में थी जब एक अपवाद फेंका गया था।
सरल उदाहरण
प्रश्न में दिए गए उदाहरण के साथ, हम यह निर्धारित कर सकते हैं कि आवेदन में अपवाद कहां फेंका गया था। आइए नज़र डालते हैं स्टैक ट्रेस पर:
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
यह एक बहुत ही सरल स्टैक ट्रेस है। यदि हम "at ..." की सूची की शुरुआत में कहते हैं, तो हम बता सकते हैं कि हमारी गलती कहां हुई। हम जिस चीज की तलाश कर रहे हैं वह सबसे ऊपरी विधि कॉल है जो हमारे एप्लिकेशन का हिस्सा है। इस मामले में, यह है:
at com.example.myproject.Book.getTitle(Book.java:16)
इसे डीबग करने के लिए, हम खोल सकते हैं Book.java
और लाइन को देख सकते हैं 16
, जो है:
15 public String getTitle() {
16 System.out.println(title.toString());
17 return title;
18 }
यह इंगित करता है कि उपरोक्त कोड में कुछ (संभवतः title
) है null
।
अपवादों की श्रृंखला के साथ उदाहरण
कभी-कभी एप्लिकेशन एक अपवाद को पकड़ लेंगे और इसे दूसरे अपवाद के कारण के रूप में फिर से फेंक देंगे। यह आमतौर पर ऐसा दिखता है:
34 public void getBookIds(int id) {
35 try {
36 book.getId(id); // this method it throws a NullPointerException on line 22
37 } catch (NullPointerException e) {
38 throw new IllegalStateException("A book has a null property", e)
39 }
40 }
यह आपको एक स्टैक ट्रेस दे सकता है जो दिखता है:
Exception in thread "main" java.lang.IllegalStateException: A book has a null property
at com.example.myproject.Author.getBookIds(Author.java:38)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
at com.example.myproject.Book.getId(Book.java:22)
at com.example.myproject.Author.getBookIds(Author.java:36)
... 1 more
इस बारे में जो अलग है वह है "इसके कारण"। कभी-कभी अपवादों में कई "कारण" खंड होंगे। इन के लिए, आप आम तौर पर "मूल कारण" को ढूंढना चाहते हैं, जो स्टैक ट्रेस में "वर्गों द्वारा सबसे कम" कारणों में से एक होगा। हमारे मामले में, यह है:
Caused by: java.lang.NullPointerException <-- root cause
at com.example.myproject.Book.getId(Book.java:22) <-- important line
फिर, यह अपवाद के साथ हम लाइन को देखने के लिए चाहते हैं 22
की Book.java
क्या कारण हो सकता है देखने के लिए NullPointerException
यहाँ।
लाइब्रेरी कोड के साथ अधिक चुनौतीपूर्ण उदाहरण
आमतौर पर स्टैक के निशान ऊपर के दो उदाहरणों की तुलना में बहुत अधिक जटिल होते हैं। यहाँ एक उदाहरण है (यह एक लंबा है, लेकिन जंजीर अपवादों के कई स्तरों को प्रदर्शित करता है):
javax.servlet.ServletException: Something bad happened
at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.example.myproject.ExceptionHandlerFilter.doFilter(ExceptionHandlerFilter.java:28)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: com.example.myproject.MyProjectServletException
at com.example.myproject.MyServlet.doPost(MyServlet.java:169)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30)
... 27 more
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.example.myproject.MyEntity]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
at $Proxy19.save(Unknown Source)
at com.example.myproject.MyEntityService.save(MyEntityService.java:59) <-- relevant call (see notes below)
at com.example.myproject.MyServlet.doPost(MyServlet.java:164)
... 32 more
Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
... 54 more
इस उदाहरण में, बहुत अधिक है। हम जिस चीज के बारे में अधिक चिंतित हैं, वह हमारे कोड के तरीकों की तलाश में है , जो com.example.myproject
पैकेज में कुछ भी होगा । दूसरे उदाहरण (ऊपर) से, हम पहले मूल कारण के लिए नीचे देखना चाहते हैं, जो है:
Caused by: java.sql.SQLException
हालाँकि, इसके तहत सभी विधि कॉल लाइब्रेरी कोड हैं। तो हम इसे ऊपर "कारण" तक ले जाएंगे, और हमारे कोड से उत्पन्न होने वाली पहली विधि कॉल की तलाश करेंगे, जो है:
at com.example.myproject.MyEntityService.save(MyEntityService.java:59)
पिछले उदाहरणों की तरह, हमें MyEntityService.java
लाइन पर देखना चाहिए 59
, क्योंकि यही त्रुटि उत्पन्न हुई (यह थोड़ा स्पष्ट है कि गलत क्या हुआ, क्योंकि SQLException त्रुटि बताती है, लेकिन डिबगिंग प्रक्रिया वह है जो हम बाद में करते हैं)।