SORU
21 EKİM 2010, PERŞEMBE


Bir yığın izleme, nedir ve nasıl uygulamam hata ayıklama için kullanabilir miyim?

Bazen benim uygulama çalıştırdığımda benim gibi görünen bir hata veriyor:

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)

İnsanlar olarak niteliyordu "iz". yığınıBir yığın izleme nedir?Benim programda oluyor bu hata hakkında bana ne söyleyebilirsin?

Bu soru oldukça sık gördüğüm bir soru gelecek bir acemi programcı "bir hata", ve onlar sadece yapıştır kendi yığın izleme ve rastgele bir kod bloğunu anlamadan ne yığın izleme veya nasıl kullanabilir. Bu soru yardımcı bir değeri yığın izleme anlayış ihtiyacı olan acemi programcılar için bir referans olarak tasarlanmıştır.

CEVAP
21 EKİM 2010, PERŞEMBE


Basit bir ifadeyle, biryığın izlemebu yöntem bir listesi uygulama bir özel Durum olduğu zaman ortasında olduğunu çağırır.

Basit Bir Örnek

Örnek soru şeklinde olmak üzere, tam istisna uygulamasında atıldı belirleyebiliriz. Hadi yığın izleme de bir bak

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)

Bu izleme çok basit bir yığın değildir. Eğer " ... " Evet, nerede hata oldu. listenin başında başlarsak Aradığımız şey buen üsttekiyöntem uygulamamız parçası Ara. Bu durumda:

at com.example.myproject.Book.getTitle(Book.java:16)

Bu hata ayıklamak için Book.java aç ve çizgisinde olan 16 bak:

public String getTitle() {
    System.out.println(title.toString()); <-- line 16
    return title;
}

Bu bir şey (muhtemelen title) yukarıdaki kodu null olduğunu gösterir.

Özel bir zincir ile örnek

Bazen uygulamalar başka bir özel Durum nedeni olarak bir İstisna ve yeniden atmak yakalayacak. Genellikle bu gibi görünüyor:

try {
....
} catch (NullPointerException e) {
  throw new IllegalStateException("A book has a null property", e)
}

Şuna benzer bir yığın izlemesi size verebilir:

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:35)
        ... 1 more

Bu konuda farklı bir şey "" Neden oldu. Bazen istisnalar"," birden çok bölümler. Neden olacaktır Bu, genellikle bulmak istiyorum "en düşük "" bölümler, yığın izlemesi. Neden biri olacaktır", kök neden Bizim durumumuzda, bu:

Caused by: java.lang.NullPointerException <-- root cause
        at com.example.myproject.Book.getId(Book.java:22) <-- important line

Yine, çizgi NullPointerException buraya neden olabilir Book.java 22 görünmek isteriz bu hariç.

Kütüphane kod ile daha zor bir örnek

Genellikle yığın izleri iki örnek yukarıda çok daha karmaşıktır. İşte bir örnek (çok uzun bir şey, ama zincirleme istisnalar da çeşitli düzeylerde gösterir):

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

Bu örnekte, bir sürü daha var. Hakkında en çok endişeliyiz ne yöntemler arıyorbizim koducom.example.myproject paketinde bir şey olurdu., İkinci örnekte (yukarıda), ilk kök neden için aşağı bakmak isteriz:

Caused by: java.sql.SQLException

Ancak, tüm yöntemi kitaplık bir kod altında diyor. "Yukarıda, ilk yöntem için Bak bizim kod kaynaklı çağrı: . Neden yukarı hareket ederiz

at com.example.myproject.MyEntityService.save(MyEntityService.java:59)

Tıpkı önceki örnekler yerdedir MyEntityService.java satır 59, çünkü bu hata kaynaklı (bu biraz tuhaf ne yanlış gitti, bu yana SQLException Birleşik Devletleri hata, ama hata ayıklama yordamı nedir, sonra).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MisterBrightside

    MisterBright

    24 Mart 2006
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007
  • Thehalopianoplayer

    Thehalopiano

    4 ŞUBAT 2011