Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

My first c# app and first null object exception

Tags:

c#

oop

Total noob here. This is my first c# attempt, its a console application that simulates a drinking game called 'Left Right Center'. In the console I receive the following:

CONSOLE

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
at LeftRightCenter.MainClass.Main (System.String[] args) [0x00038] in     /Users/apple/Projects/LearningC/LearningC/Main.cs:80 
[ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object
 at LeftRightCenter.MainClass.Main (System.String[] args) [0x00038] in /Users/apple/Projects/LearningC/LearningC/Main.cs:80 

C#

    using System;

    namespace LeftRightCenter
    {
        class Player
        {
            //fields        
            private int _quarters = 4;

            public int Quarters {
                get{ return _quarters; }
                set{ _quarters += value; }
            }

            public Player (string name)
            {

            }   

        }
        class Dice
        {
            Random random = new Random();
            public int Roll ()
            {
                random = new Random ();
                int diceSide;
                diceSide = random.Next (0, 6);
                diceSide = (diceSide > 2) ? 3 : diceSide;
                return diceSide;            
            }
        }
        class MainClass
        {
            static int activePlayer = 0;
            static int theCup       = 0;

            static Player[] thePlayers = { 
                new Player ("Jessica"), 
                new Player ("Isaac"), 
                new Player ("Ed"), 
                new Player ("Bella"),
                new Player ("Elisa"),
                new Player ("Fake RedHead"),
                new Player ("Linda"),
                new Player ("MJ"),
                new Player ("Irene"),
                new Player("Devin")
            };

            static Dice[] theDice = new Dice[2];

            private static void MoveQuarter (int direction)
            {
                int numberOfPlayers = thePlayers.Length - 1;
                switch (direction) {
                case 0: 
                    thePlayers [activePlayer].Quarters = -1;
                    theCup++;
                    break;
                case 1:
                    thePlayers [activePlayer].Quarters = -1;
                    int leftPlayer = (activePlayer == 0) ? numberOfPlayers : activePlayer - 1;
                    thePlayers [leftPlayer].Quarters = +1;
                    break;
                case 2:
                    thePlayers [activePlayer].Quarters = -1;
                    int rightPlayer = (activePlayer == numberOfPlayers) ? 0 : activePlayer + 1;
                    thePlayers [rightPlayer].Quarters = +1;
                    break;                          
                }           
            }

            public static void Main (string[] args)
            {
                int cupEndPoint = thePlayers.Length * 4 - 1;
                while (theCup < cupEndPoint) {
                    foreach (Dice rattle in theDice) {
                        if (thePlayers [activePlayer].Quarters > 0) {
                            MoveQuarter (rattle.Roll ()); // this line seems to be the problem  
                        }                   
                    }
                    Console.WriteLine ("{0} Quarters In the Cup", theCup);
                }

            }
        }
    }

I have no idea what the problem is or why, and my googling have proven more use confusing than helpful.

For those who are curious, I have little experiment working now

http://pastebin.com/jxCCW2cd

like image 503
Fresheyeball Avatar asked Feb 21 '23 03:02

Fresheyeball


1 Answers

This line

static Dice[] theDice = new Dice[2]; 

declares an array that allows the storage of 2 objects of the Dice class, but each value in this array is still null.

You need to create a Dice on each slot of the array before using it in the foreach loop inside the Main method.

theDice[0] = new Dice();
theDice[1] = new Dice();

if you stop the debugger on the line

 MoveQuarter (rattle.Roll ()); 

you will see that the rattle Dice is null.

EDIT: Looking at your code I have found a problematic situations In the Roll method, you recreate the Random generator and this is no good for randomness. (See the accepted answer in this question)
Last, theDice array could be created and initialized in the same way you already do for thePlayers array

static Dice[] theDice = new Dice[2] {new Dice(), new Dice()};

This is a complete revision of your Dice class

class Dice 
{
    private static Random random;
    public  Dice()
    {
           // create the static random generator only on the first instance
        if(random == null) random = new Random();
    }

    public int Roll () 
    { 
        int diceSide; 
        diceSide = random.Next (1, 7); 
        diceSide = (diceSide > 2) ? 3 : diceSide; 
        return diceSide;             
    } 
} 
like image 164
Steve Avatar answered Feb 27 '23 11:02

Steve