JAVA查看常見異常信息的處理方法


Java語言的異常類Exception包含着異常的全部信息。

現設異常的實例名為ex,所有的異常都是一個除以0的表達式(int i = 1 / 0)所觸發的:

1、通過ex.getMessage()可以獲取異常信息,如

/ by zero

2、通過ex.toString()可以獲取異常類型和異常信息,如

java.lang.ArithmeticException: / by zero

3、通過ex.printStackTrace()可以直接在控制台打印異常的全部信息(包括堆棧),但該函數最好不要直接調用無參數的版本,因為這樣會讓控制台顯示出現錯亂。調用printStackTrace時,通過如下方法調用:

StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
ex.printStackTrace(printWriter);
System.out.println(stringWriter.toString());

使用此方法,控制台輸出的內容為:

java.lang.ArithmeticException: / by zero
        at ExceptionTest.exec3(ExceptionTest.java:31)
        at ExceptionTest.exec2(ExceptionTest.java:23)
        at ExceptionTest.exec1(ExceptionTest.java:15)
        at ExceptionTest.main(ExceptionTest.java:39)

如果使用的是Eclipse的控制台,異常類名和指明行數的錯誤堆棧都會生成相應的跳轉鏈接。

4、通過ex.getStackTrace()可以獲取堆棧信息,這是 ex.printStackTrace() 外的另一種獲取異常堆棧信息的方法。通過此方法可以定制化輸出堆棧信息。

System.out.println(ex.getClass().getName() + ": " + ex.getMessage());
StringBuilder sbException = new StringBuilder();
for (StackTraceElement ele : ex.getStackTrace()) {
    sbException.append(MessageFormat.format("\tat {0}.{1}({2}:{3})\n",
        ele.getClassName(), ele.getMethodName(), ele.getFileName(), ele.getLineNumber()));;
}
System.out.println(sbException);

打印出的異常堆棧為:

java.lang.ArithmeticException: / by zero
        at ExceptionTest.exec3(ExceptionTest.java:31)
        at ExceptionTest.exec2(ExceptionTest.java:23)
        at ExceptionTest.exec1(ExceptionTest.java:15)
        at ExceptionTest.main(ExceptionTest.java:39)

最后列一下完整的Java代碼:

import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.MessageFormat;

/**
 * 異常打印測試
 * @文件名稱 ExceptionTest.java
 * @文件作者 Tsybius2014
 * @創建時間 2016年5月13日 下午6:14:08
 */
public class ExceptionTest {
    /** 第一層函數 */
    public static void exec1() {
        try {
            exec2();
        } catch (Exception ex) {
            throw ex;
        }
    }
    /** 第二層函數 */
    public static void exec2() {
        try {
            exec3();
        } catch (Exception ex) {
            throw ex;
        }
    }
    /** 第三層函數 */
    public static void exec3() {
        try {
            int i = 1 / 0;
        } catch (Exception ex) {
            throw ex;
        }
    }
    /** 主函數 */
    public static void main(String[] args) {
        try {
            exec1();
        } catch (Exception ex) {
            System.out.println("--- getMessage ---");
            System.out.println(ex.getMessage());
            System.out.println();
            System.out.println("--- toString ---");
            System.out.println(ex.toString());
            System.out.println();
            System.out.println("--- printStackTrace ---");
            StringWriter stringWriter = new StringWriter();
            PrintWriter printWriter = new PrintWriter(stringWriter);
            ex.printStackTrace(printWriter);
            System.out.println(stringWriter.toString());
            System.out.println();
            System.out.println("--- printStackTrace DIY ---");
            System.out.println(ex.getClass().getName() + ": " + ex.getMessage());
            StringBuilder sbException = new StringBuilder();
            for (StackTraceElement ele : ex.getStackTrace()) {
                sbException.append(MessageFormat.format("\tat {0}.{1}({2}:{3})\n",
                    ele.getClassName(), ele.getMethodName(), ele.getFileName(), ele.getLineNumber()));;
            }
            System.out.println(sbException);
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM