stack trace چیست؟

stack trace فهرستی از فراخوانی‌های متد است که وقتی Exception رخ داده، اپلیکیشن در وسط آن بوده.

این بسیار مفید است زیرا نه تنها به شما نشان می دهد که خطا کجا رخ داده است، بلکه نحوه پایان برنامه در آن مکان کد را نیز نشان می دهد. این منجر به سوال بعدی می شود:

 

مثال ساده‌ای از stack trace

با مثالی که در سوال داده شد، می‌توانیم دقیقاً مشخص کنیم که این استثنا در کجای برنامه رخ داده است. بیایید نگاهی به 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;
   }

 

این نشان می دهد که چیزی (احتمالا عنوان) در کد بالا تهی است.

 

آموزش نحوه دیباگ کردن اپلیکیشن با آنالیز کردن stack trace

گاهی اوقات برنامه‌ها یک 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

مشخصات

آخرین ارسال ها

آخرین جستجو ها


پرفروش ترینها Enigma اموزش ربات سازی و برنامه های کاربردی بهترين شيراز ahvaz صدرایی تور لحظه ای مالدیو باتري هاي گوشي سامسونگ وبلاگ چت روم سولفان کلوپ
دزدگ