stack trace فهرستی از فراخوانیهای متد است که وقتی Exception رخ داده، اپلیکیشن در وسط آن بوده.
این بسیار مفید است زیرا نه تنها به شما نشان می دهد که خطا کجا رخ داده است، بلکه نحوه پایان برنامه در آن مکان کد را نیز نشان می دهد. این منجر به سوال بعدی می شود:
با مثالی که در سوال داده شد، میتوانیم دقیقاً مشخص کنیم که این استثنا در کجای برنامه رخ داده است. بیایید نگاهی به stack trace بیندازیم:
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)
این یک stack trace بسیار ساده است. اگر از ابتدای لیست "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;
}
این نشان می دهد که چیزی (احتمالا عنوان) در کد بالا تهی است.
گاهی اوقات برنامهها یک Exception را میگیرند و دوباره آن را بهعنوان علت یک exception دیگر نشان میدهند. که به طور معمول اینگونه به نظر می رسد:
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 }
که ممکن است به شما یک stack trace شبیه مثال زیر دهد:
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
" است. گاهی اوقات Exception
ها دارای چندین بخش "Caused by" هستند. برای این موارد، شما معمولاً می خواهید علت اصلی» (root cause) را پیدا کنید، که یکی از پایین ترین بخش های Caused by
» در ردیابی stack trace خواهد بود. که در این مورد:
Caused by: java.lang.NullPointerException <-- root cause
at com.example.myproject.Book.getId(Book.java:22) <-- important line
، با این Exception، می خواهیم به خط 22 Book.java نگاه کنیم تا ببینیم چه چیزی ممکن است باعث NullPointerException شود.
معمولا stack traceها بسیار پیچیده تر از دو مثال بالا هستند. در اینجا یک مثال آورده شده است (مثالی طولانی که چندین سطح از استثناهای زنجیره ای را نشان می دهد):
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:2)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:4)
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:2)
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
در این مثال، موارد بسیار بیشتری وجود دارد. چیزی که ما بیشتر نگران آن هستیم این است که به دنبال methodهایی باشیم که از کد ما هستند، که می تواند هر چیزی در com.example.myproject باشد.
از مثال دوم (بالا)، ابتدا میخواهیم علت اصلی آن را بررسی کنیم:
Caused by: java.sql.SQLException
به هر حال، همه فراخوانیهای متد تحت آن کد کتابخانه هستند. بنابراین ما به سمت "Caused by" بالای آن حرکت می کنیم و در بلوک "Caused by" به دنبال اولین فراخوانی متد نشأت گرفته از کد ما باشید که عبارت است از:
at com.example.myproject.MyEntityService.save(MyEntityService.java:59)
مانند نمونههای قبلی، ما باید به MyEntityService.java در خط 59 نگاه کنیم، زیرا این خطا از آنجا نشأت گرفته است (در این مثال هم کمی واضح است که چه اشتباهی رخ داده است، زیرا SQLException خطا را بیان میکند، اما روش اشکالزدایی همان چیزی است که ما دنبال میکنیم).
آموزش تبدیل کدهای کاتلین به جاوا در اندروید استودیو
آموزش نحوه Lazy Load تصاویر در ListView اندروید
آموزش نحوه انتقال داده ها بین Activities در برنامه اندروید؟
آموزش به ویبره درآوردن گوشی با برنامه نویسی اندروید
stack trace چیست و چگونه با استفاده از آن اپلیکیشن خود را دیباگ کنیم؟
آموزش نحوه رفع ارور Unfortunately MyApp has stopped در اندروید
java , ,book ,at ,com ,trace ,at com ,com example ,example myproject ,stack trace ,java lang ,example myproject author ,author getbookids author ,example myproject bootstrap ,myproject author getbookids
درباره این سایت