程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 解析Java異常的棧軌跡及其相干辦法

解析Java異常的棧軌跡及其相干辦法

編輯:關於JAVA

解析Java異常的棧軌跡及其相干辦法。本站提示廣大學習愛好者:(解析Java異常的棧軌跡及其相干辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是解析Java異常的棧軌跡及其相干辦法正文


一.打印棧軌跡的辦法
自動挪用Throwable對象的printStackTrace()=printStackTrace(System.err),printStackTrace(PrintStream),printStackTrace(PrintWriter)中的個中一個。
假如一個Exception沒有被處置,直接在main辦法前面throws,法式加入前將挪用異常的printStackTrace()辦法,終究是Exception in thread "main" + printStackTrace()

二.棧軌跡
1、printStackTrace()

  起首須要明白,這個辦法其實不是來自於Exception類。Exception類自己除界說了幾個結構器以外,一切的辦法都是從其父類繼續過去的。而和異常相干的辦法都是從java.lang.Throwable類繼續過去的。而printStackTrace()就是個中一個。

  這個辦法會將Throwable對象的棧軌跡信息打印到尺度毛病輸入流上。輸入的年夜體模樣以下:

java.lang.NullPointerException
     at MyClass.mash(MyClass.java:9)
     at MyClass.crunch(MyClass.java:6)
     at MyClass.main(MyClass.java:3)

  輸入的第一行是toString()辦法的輸入,前面幾行的內容都是之前經由過程fillInStackTrace()辦法保留的內容。關於這個辦法,我們前面會講。

  上面看一個例子:

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();
    }
  }
}

  這個例子的輸入以下:

java.lang.Exception: 出成績啦!
  at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
  at TestPrintStackTrace.g(TestPrintStackTrace.java:6)
  at TestPrintStackTrace.main(TestPrintStackTrace.java:10)

  在這個例子中,在辦法f()中拋出異常,辦法g()中挪用辦法f(),在main辦法中捕捉異常,而且打印棧軌跡信息。是以,輸入順次展現了f—>g—>main的進程。

  2、getStackTrace()辦法

  這個辦法供給了對printStackTrace()辦法所打印信息的編程拜訪。它會前往一個棧軌跡元素的數組。以下面的輸入為例,輸入的第2-4行每行的內容對應一個棧軌跡元素。將這些棧軌跡元素保留在一個數組中。每一個元素對應棧的一個棧幀。數組的第一個元素保留的是棧頂元素,也就是下面的f。最初一個元素保留的棧底元素。

  上面是一個應用getStackTrace()拜訪這些軌跡棧元素並打印輸入的例子:

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()的輸入根本上是一樣的,以下:

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()辦法將前往一個Throwable對象,它是經由過程把以後挪用棧信息填入本來誰人異常對象兒樹立的,所以前往的照樣本來的異常。
挪用此辦法的那一即將成為異常新的產生地,有關本來異常產生點的信息會喪失。它的後果等價於捕捉一個異常後,從新拋出別的一種異常。二者分歧的是,fillInStackTrace後的異常照樣本來的異常(只是少了棧軌跡罷了);而從新拋出一個異常的話,完整跟原異常信息有關了(固然也沒有棧軌跡)。

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的異常棧信息均如圖:

分歧的是this自己的信息,掌握台第一行打印的就是this。
1的棧信息  

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的棧信息 

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) 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved