2013-01-02 4 views
0

나는 'tamagotchi'프로그램을 만드는 것을 포함하는 uni 프로젝트를 위해 현재 일하고있다. 그러나 나는 각기 관련된 값을 저장하기 위해 사용한 클래스 구조와 관련하여 아주 일찍 오류를 범했다. 애완 동물은 기록의 일부로 그러나 프로그램을 추적하면 변수가 초기화 된 것처럼 보이지 않고 프로그램이 변수를 처음 호출하면 NullReferenceException까지 발생합니다. 왜 어떤 아이디어?이 정적 클래스가 초기화되지 않는 이유는 무엇입니까?

static class GlobalVars  // Static class used to store pet values as 'global' variables. 
{ 
    public static TTamagotchiPet Pet1 { get; set; } 
    public static TTamagotchiPet Pet2 { get; set; } 
    public static TTamagotchiPet Pet3 { get; set; } 
    public static TTamagotchiPet Pet4 { get; set; } 
} 

public void frmTamagotchi_Load(object sender, EventArgs e)  // On Load event; initialises Pet 1. 
{ 
    tmrUpdate.Enabled = true; 
    GlobalVars.Pet1.Active = true; 
    //GlobalVars.Pet1.Dead = false; 
    //GlobalVars.Pet1.FunValue = 0; 
    //GlobalVars.Pet1.FoodValue = 0; 
    //GlobalVars.Pet1.HealthValue = 0; 
    //GlobalVars.Pet1.ExertionValue = 0; 
    //GlobalVars.Pet2.Active = false; 
    //GlobalVars.Pet3.Active = false; 
    //GlobalVars.Pet4.Active = false; 
} 

private void tmrUpdate_Tick(object sender, EventArgs e)  // Update timer. Each tick reduces pet attributes and checks to see if a pet has died, and controls pet states for the animation timer. 
{ 
// First section updates pet attributes and checks to see if health reaches the 100 limit - at which point the pet dies. 
    if (GlobalVars.Pet1.Active == true) //code crashes here 
    { 
     if (GlobalVars.Pet1.Dead == false) 
     { 

는 코드는 선이 주석에도 (필자는 frmTamagotchi_load 방법에 많은 라인을 주석 한) 초기화의 나머지 부분을 건너 뛰고; 이 문제와 관련이있을 수 있습니까?

+0

당신은 초기화 된 적이없는 정적 속성의 무리가 있습니다

당신이이를 원하시면

는 선언의 시점에서 과제를 수행해야 default(T) 이외의 값으로 초기화한다 모두 'null'. – Oded

+4

[.NET의 NullReferenceException은 무엇입니까?] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) "간접적 인"사례를 참조하십시오. – dtb

답변

7

당신은 애완 동물을 자신에 대한 값을 설정하지 않습니다.

GlobalVars.Pet1 = new TTamagotchi(); 
GlobalVars.Pet2 = new TTamagotchi(); 
GlobalVars.Pet3 = new TTamagotchi(); 
GlobalVars.Pet4 = new TTamagotchi(); 

프로그램의 시작에서, 이러한 PET1 ... Pet4 값은 널 (null)입니다, 당신은 명시 적으로 인스턴스화하지 않는 한 이렇게 남아 :

당신은 당신의 Load 메서드 또는 생성자에 다음을 둘 필요 위의 코드와 같습니다.

이 코드를 생성자에 넣는 경우 이 static 클래스이므로 static인지 확인하십시오.

+0

아, 고마워. 나는 그것이 어리석은 무엇인가 어리 석을 것이라는 것을 알고 있었다. 그러나 나는 C 언어로 많은 경험을하지 못했다. – user1943107

+1

생성자의 경우 인스턴스 생성자가 아닌 _static_ 생성자 여야합니다. – Oded

2

왜? 당신이 그것을 초기화하지 않았기 때문에. 당신은 정적의 ctor를 만들고 사용하려는 모든 속성을 초기화 할 수 있습니다 :

static GlobalVars  
{ 
    // ... 
    static GlobalVars() 
    { 
     Pet1 = new TTamagotchiPet(); 
     // ... 
    } 
} 
+2

많이 설명하지는 않지만 사실 :-) –

6

어떻게 든 속성을 초기화해야합니다. 설정하지 않았으므로 기본값은 null이며, 이는 구성원에 액세스하려는 시도가 NullReferenceException이 될 것임을 의미합니다.

static constructor 트릭을 할 것입니다 :

static class GlobalVars  // Static class used to store pet values as 'global' variables. 
{ 
    static GlobalVars 
    { 
     Pet1 = new TTamagotchi(); 
     Pet2 = new TTamagotchi(); 
     Pet3 = new TTamagotchi(); 
     Pet4 = new TTamagotchi(); 
    } 

    public static TTamagotchiPet Pet1 { get; set; } 
    public static TTamagotchiPet Pet2 { get; set; } 
    public static TTamagotchiPet Pet3 { get; set; } 
    public static TTamagotchiPet Pet4 { get; set; } 
} 
+0

정적 생성자에 +1입니다. –

0

당신은 같은 것을 필요

static class GlobalVars 
{ 
    public static TTamagotchiPet Pet1 { get; set; } 
    static GlobalVars() 
    { 
     Pet1 = new TTamagotchiPet(); 
    } 
} 
0

을 문제는 당신이 실제로 Pet1 객체를 초기화하지 않을 것입니다. 당신의 Load 방법으로이 호출을 추가하십시오 :

tmrUpdate.Enabled = true; 
GlobalVars.Pet1 = new TTamagotchiPet(); 
GlobalVars.Pet1.Active = true; 

당신은 Pet1 호출에 대한 NullReferenceException로 실행하면 안됩니다. 물론, 다른 Pet 객체도 초기화해야합니다.

1

으로 선언되어 있으며 참조 유형 인 많은 클래스 변수가 있습니다.

클래스 변수 (정적 또는 인스턴스)를 선언 할 때 default(T)이 할당됩니다. 여기서 T은 변수 유형입니다. 참조 유형 (예 : class T)의 경우 null입니다.- 그들이

static class ProbablyNotWhatYouReallyNeed 
{ 
    // assigned something other than the default at declaration 
    private static TTomagachiPet _pet1 = new TTomagachiPet(); 

    // You probably don't want to change the *instance*, but rather you want 
    // Access to the instance 
    public static TTomagachiPet Pet1 { get { return _pet1; } } 
+0

초보자가'default (타입)의 기본값 "에 대해'default (T)'로 혼동하지 말고 이야기하는 것이 더 낫지 않습니까? – svick

+0

아마도 어떤 시점에서 "유형의 기본값을 얻으려면 어떻게해야합니까?"라고 물을 것입니다. 아마도 "새로운 TTomagotchiPet()을 값을 설정하기 전에 넣어 두는 것이 더 간단 할 것입니다."하지만 그것이 문제가있는 이유는 설명하지 못했을 것입니다. – user7116

관련 문제