📜  Java中的Throwable fillInStackTrace()方法

📅  最后修改于: 2020-03-30 05:07:54             🧑  作者: Mango

java.lang.Throwable类的fillInStackTrace()方法在此Throwable对象中记录有关当前线程的堆栈帧的当前状态的信息。这意味着使用此方法可以看到类的当前方法的异常消息,其中调用fillInStackTrace()方法。如果还有其他消息可以从当前方法派生而抛出异常,则可以跳过这些其他消息详细信息。
语法:

public Throwable fillInStackTrace()

返回值:该方法返回对此Throwable对象的引用,在该对象上应用fillInStackTrace()。

下面的程序说明了Method类的fillInStackTrace()方法:
程序1:该程序显示如果不使用fillInStackTrace()方法将显示什么结果,以及如果使用fillInStackTrace()方法将发生什么结果
说明:使用fillInStackTrace()仅返回当前线程的帧的活动状态信息。因此,当调用fillInStackTrace()时,该方法将返回详细信息,直到调用fillInStackTrace()方法的main方法为止。

// Java展示如何使用
// fillInStackTrace()方法
public class GFG {
    // Main方法
    public static void main(String[] args) throws Throwable
    {
        GFG gfg = new GFG();
        try {
            // 调用此方法将会出现异常
            gfg.method();
        }
        catch (Exception e) {
            // 不使用fillInStackTrace()
            System.out.println("异常详情,没有调用fillInStackTrace()\n");
            System.err.println("在Main内调用:");
            e.printStackTrace();
            // 异常详情,调用 fillInStackTrace()
            System.out.println("异常详情,调用 fillInStackTrace()\n");
            System.err.println("在Main内调用:");
            e.fillInStackTrace();
            e.printStackTrace();
        }
    }
    // 方法调用divide运算符
    public void method() throws Throwable
    {
        divide();
    }
    // divide运算符爆出ArithmeticException异常
    void divide()
    {
        try {
            System.out.println(10 / 0);
        }
        catch (ArithmeticException e) {
            throw e;
        }
    }
}

输出:

Exception details without fillInStackTrace()
Caught Inside Main:
java.lang.ArithmeticException: / by zero
    at GFG.divide(GFG.Java:38)
    at GFG.method(GFG.Java:31)
    at GFG.main(GFG.Java:13)
Exception details with fillInStackTrace()
Caught Inside Main:
java.lang.ArithmeticException: / by zero
    at GFG.main(GFG.Java:23)

程序2:该程序在应用fillInStackTrace()之后打印详细信息。
说明:使用fillInStackTrace()仅返回当前线程的帧的活动状态信息。因此,当调用fillInStackTrace()时,该方法将返回异常详细信息,直至调用了fillInStackTrace()方法的showResults方法为止。但是main()方法显示了整个异常的详细信息,因为在main方法中未调用fillInStackTrace()。

// Java程序,展示
// fillInStackTrace()方法
public class GFG {
    // Main方法
    public static void main(String[] args) throws Throwable
    {
        GFG gfg = new GFG();
        try {
            // 调用如下方法method将会异常
            gfg.showResults();
        }
        catch (Exception e) {
            // Exception详细信息使用fillInStackTrace()
            e.printStackTrace();
        }
    }
    // 方法调用exceptionThrownMethod()
    // 当返回异常时,会调用fillInStackTrace()方法
    public void showResults() throws Throwable
    {
        try {
            exceptionThrownMethod();
        }
        catch (Exception e) {
            e.printStackTrace();
            throw e.fillInStackTrace();
        }
    }
    // 方法爆出exception
    public void exceptionThrownMethod() throws Exception
    {
        throw new Exception("this is thrown from function1()");
    }
}

输出:

java.lang.Exception: this is thrown from function1()
    at GFG.exceptionThrownMethod(GFG.Java:35)
    at GFG.showResults(GFG.Java:27)
    at GFG.main(GFG.Java:13)
java.lang.Exception: this is thrown from function1()
    at GFG.showResults(GFG.Java:30)
    at GFG.main(GFG.Java:13)