摘要:異常棧軌跡是指當(dāng)時(shí),對(duì)象拋出過(guò)程穿梭所經(jīng)歷的多個(gè)方法調(diào)用層方法調(diào)用棧。越接近語(yǔ)句的方法先進(jìn)入異常棧。異常原因鏈在類中的屬性,表示被當(dāng)前異常包裝的原始異常。可以稱為異常原因在打印異常棧軌跡時(shí),會(huì)遞歸打印原始異常的異常棧?,F(xiàn)在來(lái)分析一下方法。
(stack trace)異常棧軌跡是指:
當(dāng) throw Throwable 時(shí), Throwable對(duì)象拋出過(guò)程(穿梭)所經(jīng)歷的多個(gè)方法調(diào)用層(方法調(diào)用棧)。越接近 throw 語(yǔ)句的方法先進(jìn)入異常棧。
(Throwable Causal Chain)異常原因鏈:
在Throwable類中的cause屬性,表示被當(dāng)前異常包裝的原始異常。(可以稱為異常原因)
在打印異常棧軌跡時(shí),會(huì)遞歸打印 原始異常的異常棧。
現(xiàn)在來(lái)分析一下 Throwable.printStackTrace() 方法。
在
Throwable.printStackTrace(PrintStreamOrWriter s) 內(nèi)部,我們可以看到:
在打印異常棧時(shí),是
先打印 當(dāng)前異常對(duì)象this的 異常棧。
然后再打印 異常原因鏈。(遞歸打印 原始異常的異常棧)
synchronized (s.lock()) { // Print our stack trace // 1. 先打印 當(dāng)前異常對(duì)象this的 異常棧。 s.println(this); StackTraceElement[] trace = getOurStackTrace(); for (StackTraceElement traceElement : trace) s.println(" at " + traceElement); // Print suppressed exceptions, if any for (Throwable se : getSuppressed()) se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, " ", dejaVu); // Print cause, if any // 2. 打印 異常原因鏈 Throwable ourCause = getCause(); if (ourCause != null) ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70772.html
摘要:一拋出異常發(fā)現(xiàn)錯(cuò)誤異常也是對(duì)象使用使用異常機(jī)制來(lái)報(bào)告錯(cuò)誤。異常也是普通的類類型。異常聲明中的語(yǔ)句執(zhí)行完成后會(huì)繼續(xù)執(zhí)行后的其他語(yǔ)句。非檢查異常拋出到上一級(jí)時(shí)可以不用進(jìn)行聲明合理的使用非檢查異??梢院?jiǎn)化代碼。 為什么需要異常機(jī)制: Java的基本理念是結(jié)構(gòu)不佳的代碼不能運(yùn)行 --- Java編程思想 最理想的是在編譯時(shí)期就發(fā)現(xiàn)錯(cuò)誤,但一些錯(cuò)誤要在運(yùn)行時(shí)才會(huì)暴露出來(lái)。對(duì)于這些錯(cuò)誤我們當(dāng)然不能...
摘要:虛擬機(jī)在執(zhí)行程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域,本篇文章將會(huì)對(duì)這些數(shù)據(jù)區(qū)域進(jìn)行簡(jiǎn)略的介紹。運(yùn)行時(shí)常量池運(yùn)行時(shí)常量池是方法區(qū)的一部分。直接內(nèi)存直接內(nèi)存不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,不是虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。 Java虛擬機(jī)在執(zhí)行Java程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域,本篇文章將會(huì)對(duì)這些數(shù)據(jù)區(qū)域進(jìn)行簡(jiǎn)略的介紹。JVM所管理的內(nèi)存包括的...
摘要:是那些可能在虛擬機(jī)正常運(yùn)行期間拋出的異常的超類。運(yùn)行時(shí)異常定義及其子類都被稱為運(yùn)行時(shí)異常。對(duì)于語(yǔ)言中的關(guān)鍵字和,虛擬機(jī)中并沒(méi)有特殊的字節(jié)碼指令去支持它們,都是通過(guò)編譯器生成字節(jié)碼片段以及不同的異常處理器來(lái)實(shí)現(xiàn)。 前言 在一些傳統(tǒng)的編程語(yǔ)言,如C語(yǔ)言中,并沒(méi)有專門(mén)處理異常的機(jī)制,程序員通常用方法的特定返回值來(lái)表示異常情況,并且程序的正常流程和異常流程都采用同樣的流程控制語(yǔ)句。Java語(yǔ)言...
摘要:虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)分為以下幾個(gè)部分。程序計(jì)數(shù)器也是在虛擬機(jī)規(guī)范中唯一沒(méi)有規(guī)定任何異常情況的區(qū)域。在方法運(yùn)行期間不會(huì)改變局部變量表的大小。長(zhǎng)度在位和位的虛擬機(jī)中,分別為官方稱它為。 Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū) 詳解 2.1 概述 本文參考的是周志明的 《深入理解Java虛擬機(jī)》第二章 ,為了整理思路,簡(jiǎn)單記錄一下,方便后期查閱。 2.2 運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)在Java程序運(yùn)行時(shí)...
摘要:允許存在多個(gè),用于針對(duì)不同的異常做不同的處理。表示程序可能需要捕獲并且處理的異常。因此,我們應(yīng)該盡可能的避免通過(guò)異常來(lái)處理正常的邏輯檢查,這樣可以確保不會(huì)因?yàn)榘l(fā)生異常而導(dǎo)致性能問(wèn)題。異常表中的每一條記錄,都代表了一個(gè)異常處理器。 showImg(https://segmentfault.com/img/remote/1460000017918154?w=640&h=100); show...
閱讀 3559·2021-10-09 09:43
閱讀 6172·2021-09-07 10:15
閱讀 2757·2019-08-30 14:03
閱讀 3087·2019-08-29 11:01
閱讀 1724·2019-08-29 10:56
閱讀 1087·2019-08-28 17:52
閱讀 3508·2019-08-26 11:42
閱讀 2563·2019-08-26 10:33