2012-01-03 2 views
0

у меня есть:Почему у меня есть NullReferenceException?

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.

EDIT: Вот конструктор 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 
    } 

EDIT 2: Найдены моя проблема, но я должен идти спать, я вывешу ответ завтра.

+0

Если вам нужно больше кода, скажите мне здесь в комментариях – Bosak

+1

возможный дубликат [Что такое исключение NullReferenceException в .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in -net) –

+1

@JohnSaunders Я бы очень сомневался, что, поскольку почти все ненужные ссылки различны. –

ответ

1

Попробуйте использовать класс, локальные переменные и метод pa разницы отличаются не столько капитализацией. См. Bad Naming Convention в канонической записи NullReferenceException, указанной выше.

2

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

Есть ли в вашем StarSystem кода?

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

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

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

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

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

+0

Я инстинктивно все, что я не понимаю, о чем вы говорите – Bosak

+0

@Bosak - Где ваша строка, где создается «Планета»? 'var Planets = ???' – AllenG

+1

Он говорит о 'planetets.Count'. Он не думает, что «планеты» были инициализированы. –

0

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

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

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

+0

Это родной int. Я получаю исключение для изображения не для с. – Bosak

+0

Тогда я предлагаю положить 'if (image == null) throw new IllegalArgumentException();' в конструкторе Planet. Смотрите, если это дает вам другую ошибку. Должна быть способна определить, кто устанавливает нулевой образ. –

+0

Нет, это дает то же исключение – Bosak

Смежные вопросы