У меня есть базовый класс Animal
, который я использую в некоторых программах моделирования. В этом случае может быть до 500 Animal
с. Каждый запуск настроен таким образом, чтобы каждый Animal
выполнял что-то каждый «шаг времени». Поэтому я просто просматриваю список животных, звоните DoTimeStep
на каждом из них, пока все действия не выполняются для запуска.Как отлаживать несовместимую нулевую ссылку в C#?
Каждый класс Animal
имеет свой собственный класс регистратора для записи данных для каждого «шага времени» в симуляции. Таким образом, каждый Animal
имеет свой собственный файл журнала. Он работал отлично навсегда (3 года), пока мы не попытались запустить его на виртуальной машине. Затем, по какой-либо причине, каждый раз, когда ссылка на журнал хранится в нулевом значении для «временного шага», а затем в следующий раз она будет там. На самом деле странная часть: StreamWriter
внутри регистратора, похоже, не теряет следа, где находится его файл. Он просто пропускает запись строки для этого временного шага. И журнал ошибок показывает NullReferenceException
в классе Logger
.
Я не могу найти шаблонов для этой ситуации. Класс Animal
не был уничтожен и воссоздан. Регистратор создается в конструкторе Animal
и уничтожается в IDispose
. Любые идеи о том, как я начну отлаживать эту проблему?
Редактировать: я могу воссоздать это будет только 3 животных, поэтому 500 открытых файлов не должно быть. Но спасибо за попытку.
Редактировать: Я не уверен, что я должен делать, когда я уловил ошибку для Null Exception. Я уже поймал это, но я не могу понять, как узнать, почему это происходит. Извините за кажущуюся тупой. В стороне я попробовал Thread.Sleep (300) для 10000 циклов, чтобы узнать, не происходит ли какая-то гонка, о которой я не знал. В цикле он никогда не становился нулевым. Но через 3 секунды, когда я перебрался через двух других животных и вернулся, он больше не был нулевым.
Какую виртуальную машину вы используете? Можем ли мы увидеть код журнала, о котором идет речь, что вызывает исключение? –