Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

I'm confused about why this object is null

  1. Nov 14, 2015 #1
    I have a class like

    Code (Text):

        public class FriendList
        {
            public Dictionary<string, int> names { get; set; } // List of friends names and number of occurrences (in case two or more friends have the same name)
            public DateTime timestamp { get; set; } // date/time on the data file

            public static FriendList operator / ( FriendList first, FriendList second )
            {
                // Returns a FriendList of every friend in first but not second, with the timestamp
                // of the returned object being an arbitrary value.
                FriendList firstNotSecond = new FriendList();
                foreach ( KeyValuePair<string,int> thisName in first.names  )
                {
                    int secondNum = second.names.ContainsKey(thisName.Key) ? second.names[thisName.Key] : 0;
                    if ( thisName.Value > secondNum )
                    {
                        firstNotSecond.names[thisName.Key] = thisName.Value - secondNum;
                    }
                }
                return firstNotSecond;          
            }

            public void PrintInfo ( )
            {
                Console.WriteLine("Friends from list timestamped with {0}", this.timestamp.ToString());
                foreach ( KeyValuePair<string, int> thisFriend in this.names )
                {
                    Console.WriteLine("\t\t{0} ({1})", thisFriend.Key, thisFriend.Value);
                }
            }

            public int CountFriends ( )
            {
                int count = 0;
                foreach ( KeyValuePair<string, int> namein this.names )
                {
                    count += name.Value;
                }
                return count;
            }

        }
     
    but when I use that class in the following procedure

    Code (Text):

            private void BuildFriendHistory ( )
            {
                // Takes all text files currently in the Data folder
                // and extracts their friends lists into a List<FriendList>.
                // Prints any error encountered along the way.
                this._fhist = new List<FriendList>();
                foreach ( string thisFilePath in Directory.GetFiles(this._datadir) )
                {
                    FriendList flist = new FriendList();
                    string line;
                    System.IO.StreamReader file = new System.IO.StreamReader(thisFilePath);
                    while ( (line = file.ReadLine()) != null )
                    {
                        int k = line.LastIndexOf(' ');
                        flist.names[line.Substring(0, k)] = Int32.Parse(line.Substring(k + 1));
                    }
                    this._fhist.Add(flist);
                }
            }
     
    I'm getting a NullReferenceException on the line

    Code (Text):

    flist.names[line.Substring(0, k)] = Int32.Parse(line.Substring(k + 1))
     
    and I know (because I've stepped through and checked) that

    Code (Text):

    line.Substring(0, k)
     
    and

    Code (Text):

    Int32.Parse(line.Substring(k + 1))
     
    are not NULL. Therefore NULL is some part of

    Code (Text):

    flist.names
     
    and I'm wondering if you can help me figure out why.
     
  2. jcsd
  3. Nov 14, 2015 #2
    Mods, you can remove this thread. I figured out my problem (Needed to create a constructor for FriendList objects and in that constructor intialize this.names = new Doctionary<string,int> () )
     
  4. Nov 15, 2015 #3

    Mark44

    Staff: Mentor

    Either flist is null or flist.names is null. Before drilling down to flist.names[line.Substring(0, k)], you should do some sanity check to make sure that neither of this is null. Nowhere in the code you posted did I see anything where flist is initialized, which you're probably already figured out.

    BTW, just because a problem gets solved, we don't automatically delete a thread.
     
  5. Nov 16, 2015 #4
    I thought that if you have a class like

    Code (Text):

    public class MyClass
    {
        SomeType MyField1 { get; set; }
        SomeOtherType MyField2 { get; set; }
    }
     
    then both fields are implicitely newed when creating a new MyClass.
     
  6. Nov 16, 2015 #5

    Mark44

    Staff: Mentor

    Your code is C#, right? Assuming you have a constructor for MyClass, space is allocated for the data members of MyClass, but unless the constructor initializes these members explicitly they wil be initialized to 0 in some form, for numbers, and null if they are objects of some kind.
     
  7. Nov 16, 2015 #6
    Got it. Thanks!
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: I'm confused about why this object is null
  1. Confused about fgets (Replies: 2)

Loading...