Почему я могу «подделать» трассировку стека исключения в Java?

Используйте android:fitsSystemWindows="true" в корневом представлении вашего макета (LinearLayout в вашем случае). И android:fitsSystemWindows является внутренним атрибутом

для настройки макета представления на основе системных окон, таких как строка состояния. Если значение true, отрегулируйте прописку этого вида, чтобы оставить пространство для системных окон. Вступит в силу только в том случае, если это представление находится в не встроенной активности.

Должно быть логическое значение, либо «true», либо «false».

Это также может быть ссылка к ресурсу (в форме «@ [package:] type: name») или атрибуте темы (в форме «? [package:] [type:] name»), содержащей значение этого типа.

Это соответствует символу ресурса глобального атрибута fitsSystemWindows.

13
задан R. Martinho Fernandes 9 November 2009 в 00:50
поделиться

6 ответов

Трассировка стека создается при создании исключения, а не при его возникновении. Это заданное поведение Спецификации языка Java

20.22.1  public Throwable()

This constructor initializes a newly created Throwable object with null as
its error message string. Also, the method fillInStackTrace (§20.22.5) is
called for this object. 

....

20.22.5  public Throwable fillInStackTrace()

This method records within this Throwable object information about the
current state of the stack frames for the current thread. 

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

Однако вы можете обновить его, вызвав вручную exception.fillInStackTrace () .

Также обратите внимание, что вы должны использовать Thread.currentThread (). getStackTrace () вместо использования new Exception (). GetStackTrace () (плохой стиль).

20
ответ дан 1 December 2019 в 20:00
поделиться

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

Если вы хотите сделать это принудительно, вы должны явно вызвать exception.fillInStackTrace () .

10
ответ дан 1 December 2019 в 20:00
поделиться

Потому что вы не просили перезаписать эту трассировку стека. Он был установлен, когда вы создали его в методе setUp, и вы никогда ничего не делали, чтобы его изменить.

Класс Exception не дает вам возможности установить имя метода; это непреложно. Так что я не знаю, где вы могли бы переустановить имя метода, если только вы не хотите прибегнуть к чему-то отвратительному, как отражение.

Ваша аннотация @Test не сообщает мне, используете ли вы JUnit или TestNG, потому что я не вижу статический импорт, но в любом случае вы можете запустить тест, чтобы увидеть, выбрасывается ли конкретное исключение, используя «ожидаемый» член в аннотации @Test.

1
ответ дан 1 December 2019 в 20:00
поделиться

Вы бы не хотели генерировать исключение для изменения дорожки стека, иначе вы не могли бы безопасно повторно генерировать исключение.

public void throwsException() {
    throw new RuntimeException();
}

public void logsException() {
    try {
        throwsException();
    } catch (RuntimeException e) {
        e.printStrackTrace();
        throw e; // doesn't alter the exception.
    }
}

@Test
public void youCanSeeTheCauseOfAnException(){
    try {
        logsException();
    } catch(Exception e) {
        e.printStrackTrace(); // shows you the case of the exception, not where it was last re-thrown.
    }
}
1
ответ дан 1 December 2019 в 20:00
поделиться

Трассировка стека в исключении соответствует «новой» операции, ничего больше.

0
ответ дан 1 December 2019 в 20:00
поделиться

Я думаю, что предполагается, что вы не создадите исключение, пока не создадите его, так зачем платить за получение трассировки стека дважды?

Это Было бы сложно воссоздать трассировку стека во время ее выброса, так как это просто отправка объекта.

Исключение должно быть полностью настроено перед выбросом, поэтому часть создания экземпляра - получить трассировку стека.

ОБНОВЛЕНИЕ :

Вы можете вызвать fillInStackTrace () , чтобы решить эту проблему.

0
ответ дан 1 December 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: