一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - 解析Java異常的棧軌跡及其相關(guān)方法

解析Java異常的棧軌跡及其相關(guān)方法

2020-01-20 11:23zy19982004 JAVA教程

這篇文章主要介紹了解析Java異常的棧軌跡及其相關(guān)方法,包括棧軌跡的打印和fillInStackTrace方法等,需要的朋友可以參考下

一.打印棧軌跡的方法
主動(dòng)調(diào)用Throwable對(duì)象的printStackTrace()=printStackTrace(System.err),printStackTrace(PrintStream),printStackTrace(PrintWriter)中的其中一個(gè)。
如果一個(gè)Exception沒有被處理,直接在main方法后面throws,程序退出前將調(diào)用異常的printStackTrace()方法,最終是Exception in thread "main" + printStackTrace()

二.棧軌跡
1、printStackTrace()

  首先需要明確,這個(gè)方法并不是來自于Exception類。Exception類本身除了定義了幾個(gè)構(gòu)造器之外,所有的方法都是從其父類繼承過來的。而和異常相關(guān)的方法都是從java.lang.Throwable類繼承過來的。而printStackTrace()就是其中一個(gè)。

  這個(gè)方法會(huì)將Throwable對(duì)象的棧軌跡信息打印到標(biāo)準(zhǔn)錯(cuò)誤輸出流上。輸出的大體樣子如下:

?
1
2
3
4
java.lang.NullPointerException
     at MyClass.mash(MyClass.java:9)
     at MyClass.crunch(MyClass.java:6)
     at MyClass.main(MyClass.java:3)

  輸出的第一行是toString()方法的輸出,后面幾行的內(nèi)容都是之前通過fillInStackTrace()方法保存的內(nèi)容。關(guān)于這個(gè)方法,我們后面會(huì)講。

  下面看一個(gè)例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestPrintStackTrace {
  public static void f() throws Exception{
    throw new Exception("出問題啦!");
  }
  public static void g() throws Exception{
    f();
  }
  public static void main(String[] args) {
    try {
      g();
    }catch(Exception e) {
      e.printStackTrace();
    }
  }
}

  這個(gè)例子的輸出如下:

?
1
2
3
4
java.lang.Exception: 出問題啦!
  at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
  at TestPrintStackTrace.g(TestPrintStackTrace.java:6)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:10)

  在這個(gè)例子中,在方法f()中拋出異常,方法g()中調(diào)用方法f(),在main方法中捕獲異常,并且打印棧軌跡信息。因此,輸出依次展示了f—>g—>main的過程。

  2、getStackTrace()方法

  這個(gè)方法提供了對(duì)printStackTrace()方法所打印信息的編程訪問。它會(huì)返回一個(gè)棧軌跡元素的數(shù)組。以上面的輸出為例,輸出的第2-4行每一行的內(nèi)容對(duì)應(yīng)一個(gè)棧軌跡元素。將這些棧軌跡元素保存在一個(gè)數(shù)組中。每個(gè)元素對(duì)應(yīng)棧的一個(gè)棧幀。數(shù)組的第一個(gè)元素保存的是棧頂元素,也就是上面的f。最后一個(gè)元素保存的棧底元素。

  下面是一個(gè)使用getStackTrace()訪問這些軌跡棧元素并打印輸出的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TestPrintStackTrace {
  public static void f() throws Exception{
    throw new Exception("出問題啦!");
  }
  public static void g() throws Exception{
    f();
  }
  public static void main(String[] args) {
    try {
      g();
    }catch(Exception e) {
      e.printStackTrace();
      System.out.println("------------------------------");
      for(StackTraceElement elem : e.getStackTrace()) {
        System.out.println(elem);
      }
    }
  }
}

  這樣的輸出和printStackTrace()的輸出基本上是一樣的,如下:

?
1
2
3
4
5
6
7
java.lang.Exception: 出問題啦!
  at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
  at TestPrintStackTrace.g(TestPrintStackTrace.java:6)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:10)
TestPrintStackTrace.f(TestPrintStackTrace.java:3)
TestPrintStackTrace.g(TestPrintStackTrace.java:6)
TestPrintStackTrace.main(TestPrintStackTrace.java:10)

三.fillInStackTrace方法
native fillInStackTrace()方法將返回一個(gè)Throwable對(duì)象,它是通過把當(dāng)前調(diào)用棧信息填入原來那個(gè)異常對(duì)象兒建立的,所以返回的還是原來的異常。
調(diào)用此方法的那一行將成為異常新的發(fā)生地,有關(guān)原來異常發(fā)生點(diǎn)的信息會(huì)丟失。它的效果等價(jià)于捕獲一個(gè)異常后,重新拋出另外一種異常。兩者不同的是,fillInStackTrace后的異常還是原來的異常(只是少了棧軌跡而已);而重新拋出一個(gè)異常的話,完全跟原異常信息無(wú)關(guān)了(當(dāng)然也沒有棧軌跡)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.jyz.study.jdk.exception;
  
/**
 * 棧軌跡
 * fillInStackTrace
 * @author [email protected]
 *
 */
public class FillInStackTrace {
   
  public static void main(String[] args) throws Exception {
  test1();
  }
 
  private static void test1() throws Exception{
  try{
    test2();
  }catch(NullPointerException ex){
//1   throw (Exception)ex.fillInStackTrace();
//2   throw new Exception();
  }
  }
   
  private static void test2(){
  test3();
  }
   
  private static void test3(){
  throw new NullPointerException("str is null");
  }
 
}

1和2的異常棧信息均如圖:

解析Java異常的棧軌跡及其相關(guān)方法

不同的是this本身的信息,控制臺(tái)第一行打印的就是this。
1的棧信息  

?
1
2
3
Exception in thread "main" java.lang.NullPointerException: str is null
  at com.jyz.study.jdk.exception.FillInStackTrace.test1(FillInStackTrace.java:20)
  at com.jyz.study.jdk.exception.FillInStackTrace.main(FillInStackTrace.java:13)

 
2的棧信息 

?
1
2
3
Exception in thread "main" java.lang.Exception
  at com.jyz.study.jdk.exception.FillInStackTrace.test1(FillInStackTrace.java:21)
  at com.jyz.study.jdk.exception.FillInStackTrace.main(FillInStackTrace.java:13)

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 果冻传媒天美传媒乌鸦传媒 | 亚洲精品视频免费在线观看 | 都市后宫小说 | 楚乔传第二部免费播放电视连续剧 | 99久久爱热6在线播放 | 国产一区二区视频免费 | 欧美一级xxx | 国产精品露脸国语对白99 | 小小水蜜桃视频高清在线观看免费 | 热久久最新视频 | 欧美日韩中文国产一区 | 69成人网| 亚洲欧美另类专区 | 成人免费在线视频网 | 韩国甜性涩爱免费观看 | 欧美又大又粗又爽视频 | 翁公与小莹在客厅激情 | 午夜爱爱爱爱爽爽爽视频网站 | 久久精品成人免费网站 | 亚洲午夜视频 | avtt在线| 精品久久久久久久国产潘金莲 | 精品99在线观看 | 麻豆视频入口 | 亚洲欧美成人中文在线网站 | 国产欧美日韩综合 | sese在线 | 国产videos hd | 99精品在线免费观看 | 国产精品久久久久久久久久久久久久 | 成人精品 | 日日骑夜夜骑 | 日本剧情片在线播放中文版 | 国产良心大作白丝精厕 | 天天色视频| 亚洲天堂在线视频播放 | www.男人的天堂.com | 日韩网站免费 | chaopeng在线视频进入 | 亚洲福利在线观看 | 亚洲欧美一区二区三区在线观看 |