C # Почему Exception.StackTrace не содержит полный стек? [Дубликат]

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

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

5
задан Matt Whitfield 17 November 2014 в 14:20
поделиться

2 ответа

Exception.Stacktrace вызывает GetStackTrace, который в конце вызовет new StackTrace(this /* exception object */, true). При использовании с этими параметрами трассировка стека будет оцениваться для точки исключения до текущего метода. Вы можете убедиться в этом, добавив

catch (Exception exc)
{
    Debug.WriteLine(new StackTrace());
    Debug.WriteLine(new StackTrace(exc, true));          
}

. Вторая версия - это stacktrace, возвращаемая exc.StackTrace, первая - это полный стек из текущего метода в точку входа или запуск потока.

2
ответ дан Dirk 20 August 2018 в 08:38
поделиться

Это:

try
{
    action();
}
catch (Exception exc)
{
    Debug.WriteLine(exc.StackTrace);                
}

улавливает ваше исключение внутри Try и не распространяется вверх, чтобы развернуть столбец, он просто проглатывает исключение. Поэтому вы не видите Main как часть вашего stacktrace. Если вы хотите увидеть Main, оставьте catch вашим методом Main:

public static void Main(string[] args)
{
    try
    {
        Try(Fail);
    }
    catch (Exception e)
    {
    }
}

И теперь вы видите:

в ConsoleApplication2.Program .Fail () в C: \ Users \ Yuval \ documents \ visual studio 14 \ Projects \ ConsoleApplication2 \ ConsoleApplication2 \ Program.cs: строка 25 в ConsoleApplication2.Program.Try (действие) в C: \ Users \ Yuval \ documents \ visual studio 14 \ Projects \ ConsoleApplication2 \ ConsoleApplication2 \ Program.cs: строка 30 в ConsoleApplication2.Program.Main (String [] args) в C: \ Users \ Yuval \ documents \ visual studio 14 \ Projects \ ConsoleApplication2 \ ConsoleApplication2 \ Program. cs: строка 15

4
ответ дан Yuval Itzchakov 20 August 2018 в 08:38
поделиться
Другие вопросы по тегам:

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