Другое событие 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));
}
Время выполнения сохраняет ссылку на поток, пока это работает. Привычка GC собирает его, пока любой все еще сохраняет ту ссылку.
Это - зашитая функция сборщика "мусора". Рабочие потоки не собраны.
Это зависит от того, работает ли поток или нет. Если Вы просто создали Поток, возражают и не запустил его, это - обычный управляемый объект, т.е. имеющий право на GC. Как только Вы запускаете поток, или когда Вы получаете объект Потока для того, чтобы уже выполнить поток (GetCurrentThread), он несколько отличается. "Выставленный объект", управляемый Поток, теперь держатся сильная ссылка в CLR, таким образом, Вы всегда получаете тот же экземпляр. Когда поток завершается, эта сильная ссылка выпущена, и управляемый объект будет собран, как только у Вас нет никаких других ссылок на (теперь мертвыми) Поток.
Важный момент для замечания, хотя - если поток отмечен с IsBackground=True, он не будет препятствовать тому, чтобы целый процесс вышел
Ну, безопасно предположить что, если поток работает куда-нибудь, что что-то имеет ссылку на него так разве, которой не было бы достаточно для остановки сборки "мусора"?
Присвоить новый поток локальному полю?
class YourClass
{
Thread thread;
void Start()
{
thread = new Thread(Foo);
thread.Start();
GC.Collect();
}
}
Сборка "мусора" собирает все, что не является ссылками, таким образом, в Вашем коде нет никакой ссылки поля/переменной против потока, таким образом, это будет собрано.