Почему я получаю NullReferenceException здесь? - PullRequest
0 голосов
/ 04 января 2012

у меня есть:

partial class StarSystem : AstroThreeNode
{
    public static StarSystem SunSolarSystem()
    {
        return new StarSystem("Solar System", Planet.SunCenter(), Resources.Space, SolarSystem.ActiveForm.Bounds).AddPlanet(Planet.MercuryPlanet(), Planet.VenusPlanet(), Planet.EarthPlanet(), Planet.MarsPlanet(), Planet.JupiterPlanet(), Planet.SaturnPlanet(), Planet.UranusPlanet(), Planet.NeptunePlanet());
    }

    public StarSystem AddPlanet(params Planet[] planetsToAdd)
    {
        foreach (Planet planet in planetsToAdd)
        {
            distanceFromSun += (planets.Count > 0 ? planets[planets.Count - 1].Image.Width / 2 : 0) + planet.Image.Width / 2 + DISTANCE_BETWEEN_PLANETS;
            planet.DistanceFromSun = distanceFromSun;
            planet.RotationCenter = new PointF(bounds.Width / 2, bounds.Height / 2);
            planets.Add(planet);
        }
        return this;
    }
}


partial class Planet : AstroThreeNode
{
    private const float SUN_SPEED = 0;
    public static Planet SunCenter() 
    {
        return new Planet("Слънце", Resources.Sun_, SUN_SPEED, CLOCKWISE);
    }
    public static Planet MercuryPlanet()
    {
        return new Planet("Меркурий", Resources.Mercury_, 4.0923f, Planet.CLOCKWISE);
    }
    public static Planet VenusPlanet()
    {
        return new Planet("Венера", Resources.Venus_, 1.6021f, Planet.COUNTERCLOCKWISE);
    }
    public static Planet EarthPlanet()
    {
        return new Planet("Земя", Resources.Earth_, 0.9856f, Planet.CLOCKWISE);
    }
    public static Planet MarsPlanet()
    {
        return new Planet("Марс", Resources.Mars_, 0.5240f, Planet.CLOCKWISE);
    }
    public static Planet JupiterPlanet()
    {
        return new Planet("Юпитер", Resources.Jupiter_, 0.0830f, Planet.CLOCKWISE);
    }
    public static Planet SaturnPlanet()
    {
        return new Planet("Сатурн", Resources.Saturn_, 0.0334f, Planet.CLOCKWISE);
    }
    public static Planet UranusPlanet()
    {
        return new Planet("Уран", Resources.Uranus_, 0.0117f, Planet.COUNTERCLOCKWISE);
    }
    public static Planet NeptunePlanet() 
    {
        return new Planet("Нептун", Resources.Neptune_, 0.0059f, Planet.CLOCKWISE);
    }

    public Planet(string name, Image image, float distanceFromSun, float degreesAddedEachTick, bool clockwise, PointF rotationCenter, float angleInDegrees = 0)
    {
        this.Name = name;
        this.Image = image; // here I set the Image but I get an exception later
        this.DistanceFromSun = distanceFromSun;
        this.degreesAddedEachTick = degreesAddedEachTick;
        this.isClockwiseRotation = clockwise;
        this.RotationCenter = rotationCenter;
        this.angleInDegrees = angleInDegrees;
    }
}

Я получаю исключение здесь: distanceFromSun += (planets.Count > 0 ? planets[planets.Count - 1].Image.Width / 2 : 0) + planet.Image.Width / 2 + DISTANCE_BETWEEN_PLANETS; Для planet.Image. Я не понимаю, почему я получаю исключение при установке изображения при создании Planet.

РЕДАКТИРОВАТЬ: Вот конструктор для StarSystem:

    public StarSystem(string name, Planet starSystemCenter, Image background, Rectangle bounds)
    {
        this.Name = name;
        this.Background = background;
        this.bounds = bounds;
        planets = new List<Planet>(); //planets instanieted here
        planets.Add(starSystemCenter); // note I dont get the exception on this call but on the other call where I add all other planest
    }

РЕДАКТИРОВАТЬ 2: Обнаружил мою проблему, но я должен идти спать, я отправлю ответ завтра.

Ответы [ 3 ]

2 голосов
/ 04 января 2012

Похоже, вы никогда не создаете экземпляр своего объекта 'Планеты' (вероятно, List<Planet>?)

Это в вашем StarSystem коде?

Предположительно это будет что-то вроде

public class StarSystem
{
    public List<Planet> planets {get; set;}
    //Other code here

    public StarSystem()
    {
        planets = new List<Planet>();
    }
}

Но этот код отсутствует в вашем сообщении. Это то, что я считаю наиболее вероятным виновником.

Опубликовать вопрос Редактировать: Хорошо, тогда единственное, что, похоже, уходит, это .Image для одной или нескольких ваших планет. Когда вы отлаживаете, вы должны иметь возможность наблюдать за вашими переменными - я бы установил точку останова, прежде чем она вычислит это выражение, и посмотрим на последний добавленный объект, а также на следующий объект, который он собирается добавить, и поищем нуль .Image

1 голос
/ 04 января 2012

Старайтесь, чтобы члены класса, локальные переменные и параметры метода отличались более чем на заглавные буквы. См. Соглашение о недопустимом наименовании в каноническом посте NullReferenceException, связанном выше.

0 голосов
/ 04 января 2012

Вы создаете каждую планету с помощью этого конструктора

public Planet(string name, Image image, float distanceFromSun, float degreesAddedEachTick, bool clockwise, PointF rotationCenter, float angleInDegrees = 0)

Тем не менее, вы никогда не проверяете, чтобы убедиться, что image != null && image.Width != null (если width является нативным int, вам не нужно, но если это Number тебе нужен этот чек.

...