国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

什么是堆棧跟蹤,我如何使用它來調試我的應用程序錯誤?

有時當我運行我的應用程序時,它會給我一個看起來像這樣的錯誤:

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)

人們將此稱為“堆棧跟蹤”。什么是堆棧跟蹤?它能告訴我關于程序中發(fā)生的錯誤的什么信息?


關于這個問題——我經??吹叫率殖绦騿T“遇到錯誤”的問題,他們只是簡單地粘貼他們的堆棧跟蹤和一些隨機代碼塊,而不了解堆棧跟蹤是什么或他們如何使用它。此問題旨在為可能需要幫助以了解堆棧跟蹤的價值的新手程序員提供參考。


簡單來說,堆棧跟蹤是應用程序在拋出異常時所處的方法調用的列表。

簡單例子

通過問題中給出的示例,我們可以準確地確定應用程序中拋出異常的位置。讓我們看一下堆棧跟蹤:

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 ...”列表的開頭開始,我們就可以知道我們的錯誤發(fā)生在哪里。我們正在尋找的是屬于我們應用程序一部分的最頂層方法調用。在這種情況下,它是:

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

要調試它,我們可以打開Book.java并查看 line 16,它是:

public String getTitle() {
System.out.println(title.toString());
return title;
}

這表明上面的代碼中title有某些東西(可能) 。null

具有異常鏈的示例

有時應用程序會捕獲異常并將其作為另一個異常的原因重新拋出。這通常看起來像:

public void getBookIds(int id) {
try {
    book.getId(id);// this method it throws a NullPointerException on line 22
    } catch (NullPointerException e) {
    throw new IllegalStateException("A book has a null property", e)
    }
}

這可能會給你一個看起來像這樣的堆棧跟蹤:

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”。有時異常會有多個“原因”部分。對于這些,您通常希望找到“根本原因”,這將是堆棧跟蹤中最低的“原因”部分之一。在我們的例子中,它是:

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

同樣,除了這個例外,我們希望查看 line 22ofBook.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

但是,其下的所有方法調用都是庫代碼。所以我們將移動到它上面的“Caused by”,并在那個“Caused by”塊中,查找源自我們代碼的第一個方法調用,它是:

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

與前面的示例一樣,我們應該查看MyEntityService.javaonline 59,因為這是此錯誤的來源(這個有點明顯出了什么問題,因為 SQLException 指出了錯誤,但調試過程正是我們所追求的)。




文章來源地址http://www.zghlxwxcb.cn/article/262.html

到此這篇關于什么是堆棧跟蹤,我如何使用它來調試我的應用程序錯誤?的文章就介紹到這了,更多相關內容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/262.html

如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請聯(lián)系站長進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 解決Tomcat異常:java.lang.IllegalStateException: 非法訪問:此Web應用程序實例已停止。無法加載。為了調試以及終止導致非法訪問的線程,將拋出以下堆棧跟蹤。

    解決Tomcat異常:java.lang.IllegalStateException: 非法訪問:此Web應用程序實例已停止。無法加載。為了調試以及終止導致非法訪問的線程,將拋出以下堆棧跟蹤。

    調試項目的時候發(fā)現(xiàn)每次使用idea重新部署項目時會出現(xiàn)這個錯誤,但是不影響實際使用,重啟服務器第一次部署時也不會出現(xiàn)錯誤,嘗試搜索解決這個問題。 解決方法: 進入tomcat目錄下查找配置文件,conf Context.xml,查找Context標簽,修改屬性reloadble為 reloadable=“false” (如果

    2024年02月04日
    瀏覽(34)
  • 如何在 2022 年為 Web 應用程序選擇技術堆棧

    如何在 2022 年為 Web 應用程序選擇技術堆棧

    選擇最佳的 Web 應用程序堆棧并非易事:它必須在資源和質量方面達到最佳。 Web 應用程序開發(fā)所需的質量、成本和時間將取決于您的選擇。 這就是為什么選擇技術堆??赡苄枰饶A期更多的時間。 在本文中,我將幫助您選擇最有效的 Web 開發(fā)技術棧。 我將解釋哪些技術可

    2024年02月01日
    瀏覽(25)
  • 什么是RESTful API,以及如何它使用構建 web 應用程序(InsCode AI 創(chuàng)作助手)

    RESTful API 是一種基于 REST(Representational State Transfer,表征狀態(tài)轉移) 架構風格的 API,它使用 HTTP 協(xié)議的方法(GET,POST,PUT,DELETE)來實現(xiàn)資源的創(chuàng)建、讀取、更新和刪除。通過這種方式,API 可以更加簡單和靈活,使得不同編程語言之間的交互更加容易。 使用 RESTful API 構建

    2024年02月09日
    瀏覽(33)
  • 為什么我的微信小程序開發(fā)工具調試窗口一片空白?

    為什么我的微信小程序開發(fā)工具調試窗口一片空白?

    解決方案 先卸載現(xiàn)在版本,更新了一下微信小程序開發(fā)工具就好啦! 如果消息顯示調試器加載錯誤,從任務欄打開工具可能導致該問題,那么就從桌面上打開,就能看見調試器中的內容了。

    2024年02月11日
    瀏覽(29)
  • 軟件崩潰時Visual Studio中看不到有效的調用堆棧,使用Windbg動態(tài)調試去分析定位

    目錄 1、問題說明 2、使用Windbg查看崩潰時詳細的函數(shù)調用堆棧

    2024年02月05日
    瀏覽(55)
  • RK3568平臺開發(fā)系列講解(調試篇)如何跟蹤系統(tǒng)事件

    RK3568平臺開發(fā)系列講解(調試篇)如何跟蹤系統(tǒng)事件

    沉淀、分享、成長,讓自己和他人都能有所收獲!?? ??本文我們要介紹 Linux 上兩個非常有用的工具: ltrace 和 strace 。在分析軟件的運行過程、調試疑難 Bug 、執(zhí)行性能分析和調優(yōu)等方面,它們都是非常有用的輔助工具。另外,我們還會介紹與之相關的一個功能強大的系統(tǒng)調

    2023年04月18日
    瀏覽(105)
  • 使用 YOLOv8 和 Streamlit 構建實時對象檢測和跟蹤應用程序:第 1 部分-介紹和設置

    使用 YOLOv8 和 Streamlit 構建實時對象檢測和跟蹤應用程序:第 1 部分-介紹和設置

    示例:圖像上的對象檢測 實時視頻中的目標檢測和跟蹤是計算機視覺的一個重要領域,在監(jiān)控、汽車和機器人等各個領域都有廣泛的應用。 由于需要能夠識別和跟蹤對象、確定其位置并對它們進行實時分類的自動化系統(tǒng),對視頻幀中的實時對象檢測和跟蹤的需求日益增加。

    2024年02月17日
    瀏覽(28)
  • jstack(Stack Trace for Java)Java堆棧跟蹤工具

    jstack(Stack Trace for Java)Java堆棧跟蹤工具

    jstack(Stack Trace for Java)命令用于生成虛擬機當前時刻的線程快照(一般稱為 threaddump 或者 javacore文件 )。 線程快照就是當前虛擬機內每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的目的通常是定位線程出現(xiàn)長時間停頓的原因,如線程間死鎖、死循環(huán)、請求外部資源

    2024年02月12日
    瀏覽(23)
  • 如何調試移動應用程序數(shù)據(jù)庫問題并優(yōu)化數(shù)據(jù)存儲性能

    在移動應用開發(fā)的動態(tài)領域中,無缺陷的用戶體驗是最終目標。然而,在表面下隱藏著一個復雜的數(shù)據(jù)存儲和檢索網(wǎng)絡。當數(shù)據(jù)庫問題出現(xiàn)時,它們可能會干擾甚至最精心設計的應用程序。這就是為什么了解如何調試移動應用程序數(shù)據(jù)庫問題和優(yōu)化數(shù)據(jù)存儲性能對于追求卓越

    2024年02月13日
    瀏覽(30)
  • 編寫并調試一個堆棧溢出的程序

    編寫并調試一個堆棧溢出的程序

    編寫存在棧溢出漏洞的 c++ 程序: stack_overflow.cpp 對于 GCC 編譯器,可以嘗試使用 -fno-stack-protector ? 選項來禁用堆棧保護。 使用 -g ?使其可調試 編譯命令: g++ stack_overflow.cpp -o stack_overflow -g -fno-stack-protector ? ? 使用 gdb 查看 stack_overflow 函數(shù)的地址:0x000055555555520e 命令是

    2024年03月26日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包