Другое событие 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));
}
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
, первая - это полный стек из текущего метода в точку входа или запуск потока.
Это:
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
blockquote>