সহজ কথায়, একটি স্ট্যাক ট্রেস হল সেই পদ্ধতিতে কলগুলির একটি তালিকা যা কোনও ব্যতিক্রম নিক্ষেপ করার সময় অ্যাপ্লিকেশনটির মাঝখানে ছিল।
সাধারণ উদাহরণ
প্রশ্নে দেওয়া উদাহরণের সাহায্যে আমরা ঠিক করতে পারি যে আবেদনে ব্যতিক্রমটি কোথায় ছুঁড়েছে। স্ট্যাক ট্রেসটি একবার দেখে নেওয়া যাক:
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 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
, কারণ এই ত্রুটিটি এখানেই উদ্ভূত হয়েছিল (এটি কী ভুল হয়েছে তা কিছুটা স্পষ্ট, যেহেতু এসকিএলএক্সসেপশন ত্রুটিটি জানিয়েছে, তবে ডিবাগিং পদ্ধতিটি আমাদের পরে রয়েছে)।