Что означает `int dummy` в методе fillInStackTrace() в Java?

#java #exception #runtimeexception #throwable

#java #исключение #исключение runtimeexception #бросаемый

Вопрос:

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

Кажется, что dummy действительно dummy, не имеет значения, какое значение я ввожу, результат будет тем же…

Я хотел ограничить размер трассировки стека до 3, чтобы потреблять меньше памяти, а также создавать исключения было бы быстрее с точки зрения выполнения. У меня есть реальный вариант использования, когда мне нужно много исключений, но с мелкими трассировками стека.

Комментарии:

1. Почему вас это волнует? Просто из любопытства?

2. dummy это значение, которое не будет использоваться. Я предполагаю, что здесь: им нужно было определить метод без параметров, который выполняет что-то, а затем вызывает собственную версию, и поскольку у вас не может быть методов с тем же именем и теми же параметрами, они добавили фиктивный параметр, который игнорируется собственной реализацией.

3. @FedericoklezCulloca вероятно, это правильно, я протестировал это (см. Мое обновление), и это действительно ничего не дает.. Я надеялся, что смогу как-то ограничить размер трассировки стека (чтобы потреблять меньше памяти и быть более эффективным для создания исключений)

4. Бросаю предложение здесь: учитывая ваш вариант использования, вы больше не заботитесь об этом параметре. На вашем месте я бы удалил этот вопрос и открыл новый с вашим актуальным вопросом (т. Е.: как мне ограничить размер трассировки стека?).

5. @FedericoklezCulloca, я согласен с вами, но я не смог найти никакого решения до Java 9. Существует StackWalking API для Java 9 , который подходит для моего варианта использования, но я использую Java 8:(

Ответ №1:

Это ничего не значит. Это фиктивный аргумент.

Реализация машинного кода полностью игнорирует аргумент. Например, в OpenJDK 11 реализация метода bridge выглядит следующим образом:

 /*
 * 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 аргумент игнорируется.


Если вы ищете способ ограничить глубину трассировки стека, поддерживаемый способ сделать это — использовать -XX:MaxJavaStackTraceDepth=depth опцию.