java中fillinstacktrace()方法中“int dummy”的含义是什么?

eh57zj3b  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(461)
private native Throwable fillInStackTrace(int dummy);

使用调用此方法 dummy=0 创建异常时。这是什么意思 dummy ? 构造堆栈跟踪的深度是多少?
更新:

public class MyEx extends RuntimeException{

    @Override
    public synchronized Throwable fillInStackTrace() {
        Method method = null;
        try {
            Class<?>[] classArray = new Class<?>[1];
            classArray[0] = int.class;
            method =Throwable.class.getDeclaredMethod("fillInStackTrace", classArray);
            method.setAccessible(true);
            Object obg = method.invoke(this, 6);

            StackTraceElement[] trace = ((MyEx) obg).getStackTrace();
            System.out.println();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return this;
    }
}

看来,哑巴真的是哑巴,不管我投什么值,结果都是一样的。。。
我想将堆栈跟踪大小限制为3以消耗更少的内存,并且从执行的Angular 来看创建异常会更快。我有一个真正的用例,我需要很多异常,但是有浅层堆栈跟踪。

x6h2sr28

x6h2sr281#

这没有任何意义。这是一个伪论点。
本机代码实现完全忽略参数。例如,在openjdk 11中,桥接方法实现如下:

/*
 * Fill in the current stack trace in this exception.  This is
 * usually called automatically when the exception is created but it
 * may also be called explicitly by the user.  This routine returns
 * `this' so you can write 'throw e.fillInStackTrace();'
 */
JNIEXPORT jobject JNICALL
Java_java_lang_Throwable_fillInStackTrace(JNIEnv *env, 
        jobject throwable, jint dummy)
{
    JVM_FillInStackTrace(env, throwable);
    return throwable;
}

如你所见 dummy 参数被忽略。
如果您正在寻找限制stacktrace深度的方法,支持的方法是使用 -XX:MaxJavaStackTraceDepth=depth 选项。

相关问题