Метод fillInStackTrace(), реализованный в классе Throwable позволяет получить объект типа Throwable, с сохранением трассировки стека вызывающего объекта в только что созданном объекте.
Причина моего вопроса в следующем:
class one {
static Throwable w_exc(){
ArithmeticException ar_exc = new ArithmeticException();
Throwable ar_exc_1 = ar_exc.fillInStackTrace();
return ar_exc_1;}
public static void main(String[] argc){
Throwable exc_1 = w_exc();
StackTraceElement[] stacktrace = exc_1.getStackTrace();
for (StackTraceElement element : stacktrace){
System.out.println(element);
}
System.out.println(exc_1.toClass());
}
}
При выполнении получим:
one.w_exc(one.java:4)
one.main(one.java:7)
Но если перенести вызов метода fillInStackTrace() в метод main():
class one {
static Throwable w_exc(){
ArithmeticException ar_exc = new ArithmeticException();
return ar_exc;}
public static void main(String[] argc){
Throwable exc_1 = (w_exc()).fillInStackTrace();
StackTraceElement[] stacktrace = exc_1.getStackTrace();
for (StackTraceElement element : stacktrace){
System.out.println(element);
}
}
}
мы получим
one.main(one.java:6)
т.е. из стека потеряли методы, которые вызывались до этого, хотя в первом варианте сохранились. Так вот, почему в первом внутренние методы сохранились, хотя при возврате объекта из метода они должны были быть вытолкнуты из стека и в обеих случаях возвращается объект одного и того же класса? Вопрос может быть несколько простой, но все равно не смог понять. upd. поднимаю
Согласно документации fillInStackTrace() записывает в объект Throwable текущее состояние стека. Если использовать getStackTrace(), результат будет такой же, как в первом случае.
public static void main(String[] argc) {
Throwable result = w_exc();
// Throwable exc_1 = result.fillInStackTrace();
// System.out.println(exc_1==result);
for (StackTraceElement element: result.getStackTrace()) {
System.out.println(element);
}
}
Обратите внимание, если раскомментировать строку с fillInStackTrace(), StackTrace в result будет изменён, нового объекта Throwable не создаётся.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей