小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java的異常跟蹤棧

 碼農(nóng)9527 2021-09-18

    異常對(duì)象的printStackTrace()方法用于打印異常的跟蹤棧信息,根據(jù)printStackTrace()方法的輸出結(jié)果,開(kāi)發(fā)者可以找到異常的源頭,并跟蹤到異常一路觸發(fā)的過(guò)程。

    看下面用于測(cè)試printStackTrace的例子程序。

class SelfException extends RuntimeException {
 SelfException() {
 }
 SelfException(String msg) {  super(msg);
 }
}public class PrintStackTraceTest { public static void main(String[] args) {
  firstMethod();
 } public static void firstMethod() {
  secondMethod();
 } public static void secondMethod() {
  thirdMethod();
 } public static void thirdMethod() {  throw new SelfException("自定義異常信息");
 }
}123456789101112131415161718192021復(fù)制代碼類(lèi)型:[java]

    上面程序中main方法調(diào)用firstMethod,firstMethod調(diào)用secondMethod,secondMethod調(diào)用thirdMethod,thirdMethod直接拋出一個(gè)SelfException異常。運(yùn)行上面程序,會(huì)看到如下所示的結(jié)果。

Exception in thread "main" Test.SelfException: 自定義異常信息
  at Test.PrintStackTraceTest.thirdMethod(PrintStackTraceTest.java:26)
  at Test.PrintStackTraceTest.secondMethod(PrintStackTraceTest.java:22)
  at Test.PrintStackTraceTest.firstMethod(PrintStackTraceTest.java:18)
  at Test.PrintStackTraceTest.main(PrintStackTraceTest.java:14)12345復(fù)制代碼類(lèi)型:[java]

    上面運(yùn)行結(jié)果的第2行到第5行之間的內(nèi)容是異常跟蹤棧信息,從打印的異常信息我們可以看出,異常從thirdMethod方法開(kāi)始觸發(fā),傳到secondMethod方法,再傳到firstMethod方法,最后傳到main方法,在main方法終止,這個(gè)過(guò)程就是Java的異常跟蹤棧。

    在面向?qū)ο蟮木幊讨?,大多?shù)復(fù)雜操作都會(huì)被分解成一系列方法調(diào)用。這是因?yàn)閷?shí)現(xiàn)更好的可重用性,將每個(gè)可重用的代碼單元定義成方法,將復(fù)雜任務(wù)逐漸分解為更易管理的小型子任務(wù)。由于一個(gè)大的業(yè)務(wù)功能需要由多個(gè)對(duì)象來(lái)共同實(shí)現(xiàn),在最終編程模型中,很多對(duì)象將通過(guò)一系列方法調(diào)用來(lái)實(shí)現(xiàn)通信,執(zhí)行任務(wù)。

    所以,面向?qū)ο蟮膽?yīng)用程序運(yùn)行時(shí),經(jīng)常會(huì)發(fā)生一系列方法調(diào)用,從而形成“方法調(diào)用?!保惓5膫鞑t相反:只要異常沒(méi)有被完全捕獲(包括異常沒(méi)有被捕獲,或異常被處理后重新拋出了新異常),異常從發(fā)生異常的方法逐漸向外傳播,首先傳給該方法的調(diào)用者,該方法調(diào)用者再次傳給其調(diào)用者……,直至最后傳到main方法,如果main方法依然沒(méi)有處理該異常,則JVM會(huì)中止該程序,并打印異常的跟蹤棧信息。

    很多初學(xué)者一看到上面運(yùn)行結(jié)果的異常提示信息,就會(huì)驚慌失措,其實(shí)結(jié)果中的異常跟蹤棧信息非常清晰,它記錄了應(yīng)用程序中執(zhí)行停止的各個(gè)點(diǎn)。

    異常跟蹤棧信息的第一行一般詳細(xì)顯示異常的類(lèi)型和異常的詳細(xì)消息,接下來(lái)是所有異常的發(fā)生點(diǎn),各行顯示被調(diào)用方法中執(zhí)行的停止位置,并標(biāo)明類(lèi)、類(lèi)中的方法名、與故障點(diǎn)對(duì)應(yīng)的文件的行。一行行地往下看,跟蹤??偸亲顑?nèi)部的被調(diào)用方法逐漸上傳,直到最外部業(yè)務(wù)操作的起點(diǎn),通常就是程序的入口main方法或Thread類(lèi)的run方法(多線程的情形)。

    下面例子程序示范了多線程程序中發(fā)生異常的情形。

public class ThreadExceptionTest implements Runnable { public void run() {
  firstMethod();
 } public void firstMethod() {
  secondMethod();
 } public void secondMethod() {  int a = 5;  int b = 0;  int c = a / b;
 } public static void main(String[] args) {  new Thread(new ThreadExceptionTest()).start();
 }
}12345678910111213141516復(fù)制代碼類(lèi)型:[java]

    運(yùn)行上面程序,會(huì)看到如下運(yùn)行結(jié)果。

Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero
   at Test.ThreadExceptionTest.secondMethod(ThreadExceptionTest.java:14)
   at Test.ThreadExceptionTest.firstMethod(ThreadExceptionTest.java:8)
   at Test.ThreadExceptionTest.run(ThreadExceptionTest.java:4)
   at java.lang.Thread.run(Unknown Source)12345復(fù)制代碼類(lèi)型:[java]

    多線程異常的跟蹤棧,從發(fā)生異常的方法開(kāi)始,到線程的run方法結(jié)束。從上面的運(yùn)行結(jié)果可以看出,程序在Thread的run方法中出現(xiàn)了ArithmeticException異常,這個(gè)異常的源頭是ThreadExcetpionTest的secondMethod方法,位于ThreadExcetpionTest.java文件的14行。這個(gè)異常傳播到Thread類(lèi)的run方法就會(huì)結(jié)束(如果該異常沒(méi)有得到處理,將會(huì)導(dǎo)致該線程中止運(yùn)行)。

    前面已經(jīng)講過(guò),調(diào)用Exception的printStackTrace()方法就是打印該異常的跟蹤棧信息,也就會(huì)看到上面兩個(gè)示例運(yùn)行結(jié)果中的信息。當(dāng)然,如果方法調(diào)用的層次很深,將會(huì)看到更加復(fù)雜的異常跟蹤棧。

    提示:雖然printStackTrace()方法可以很方便地用于追蹤異常的發(fā)生情況,可以用它來(lái)調(diào)試程序,但在最后發(fā)布的程序中,應(yīng)該避免使用它。應(yīng)該對(duì)捕獲的異常進(jìn)行適當(dāng)?shù)奶幚?,而不是?jiǎn)單地將異常的跟蹤棧信息打印出來(lái)。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多