public class Solution {
    public static void main(String[] args) throws Exception {
        method1();
    }
    public static String method1() {
        method2();
        StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
        System.out.println(StackTrace[2].getMethodName());
        return StackTrace[2].getMethodName();
    }
    public static String method2() {
        method3();
        StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
        System.out.println(StackTrace[2].getMethodName());
        return StackTrace[2].getMethodName();
    }
    public static String method3() {
        method4();
        StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
        System.out.println(StackTrace[2].getMethodName());
        return StackTrace[2].getMethodName();
    }
    public static String method4() {
        method5();
        StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
        System.out.println(StackTrace[2].getMethodName());
        return StackTrace[2].getMethodName();
    }
    public static String method5() {
        {
            StackTraceElement[] StackTrace = Thread.currentThread().getStackTrace();
            System.out.println(StackTrace[2].getMethodName());
            return StackTrace[2].getMethodName();
        }
    }
}
Короче говоря не понял, а нашел ответ в обсуждениях. Получается, что стэк это массив методов, нумерация которого начинается так же с [0]. Тогда почему в коде в каждом методе мы выводит и возвращаем имя [2] элемента и этого правильно, ведь по сути мы выводим method4 тогда, а выводятся и возвращаются всё равно другие значения и имена других методов.