My dearest friends,
Please I am facing the System.NullReferenceException in Program.cs. It says that "EventManager.NoArgumentInvoker.get returned null" how should I suppose to do? Please, can someone can else fix my exception. Any help will be very very appreciated. Please fix my error.
This is the code of Program.cs:
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using UnityEngine;
- namespace ProgrammingAssignment3
- {
- ///
- /// Programming Assignment 3
- ///
- class Program
- {
- // test case to run
- static int testCaseNumber;
- // debug log messages
- static List<string> logMessages = new List<string>();
- ///
- /// Tests the Programming Assignment 3 classes
- ///
- /// command-line args
- static void Main(string[] args)
- {
- // listen for Unity debug log events
- UnityEngine.Debug.LogEvent.AddListener(HandleLogEvent);
- // create Invoker and Listener
- Invoker invoker = new Invoker();
- Listener listener = new Listener();
- // Awake is always called before Start
- invoker.Awake();
- // loop while there's more input
- string input = Console.ReadLine();
- while (input[0] != 'q')
- {
- // extract test case number from string
- GetInputValueFromString(input);
- // execute selected test case
- switch (testCaseNumber)
- {
- case 1:
- // invoker added to event manager first for no argument event
- InitializeTestCase(invoker, listener);
- EventManager.NoArgumentInvoker.InvokeNoArgumentEvent();
- if (logMessages[0] == "MessageEvent" &&
- logMessages.Count == 1)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 2:
- logMessages.Clear();
- EventManager.ClearInvokersAndListeners();
- // listener added to event manager first for no argument event
- listener.Start();
- invoker.Start();
- EventManager.NoArgumentInvoker.InvokeNoArgumentEvent();
- if (logMessages[0] == "MessageEvent" &&
- logMessages.Count == 1)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 3:
- // invoker added to event manager first for one argument event
- InitializeTestCase(invoker, listener);
- EventManager.IntArgumentInvoker.InvokeOneArgumentEvent(-1);
- if (logMessages[0] == "CountMessageEvent: -1" &&
- logMessages.Count == 1)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 4:
- logMessages.Clear();
- EventManager.ClearInvokersAndListeners();
- // listener added to event manager first for one argument event
- listener.Start();
- invoker.Start();
- EventManager.IntArgumentInvoker.InvokeOneArgumentEvent(-1);
- if (logMessages[0] == "CountMessageEvent: -1" &&
- logMessages.Count == 1)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 5:
- InitializeTestCase(invoker, listener);
- // invoke no argument event directly through invoker
- invoker.InvokeNoArgumentEvent();
- if (logMessages[0] == "MessageEvent" &&
- logMessages.Count == 1)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 6:
- InitializeTestCase(invoker, listener);
- // invoke one argument event directly through invoker
- invoker.InvokeOneArgumentEvent(-1);
- if (logMessages[0] == "CountMessageEvent: -1" &&
- logMessages.Count == 1)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 7:
- InitializeTestCase(invoker, listener);
- // invoke multiple no argument events directly through invoker
- invoker.InvokeNoArgumentEvent();
- invoker.InvokeNoArgumentEvent();
- invoker.InvokeNoArgumentEvent();
- if (logMessages[0] == "MessageEvent" &&
- logMessages[1] == "MessageEvent" &&
- logMessages[2] == "MessageEvent" &&
- logMessages.Count == 3)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 8:
- InitializeTestCase(invoker, listener);
- // invoke multiple one argument events directly through invoker
- invoker.InvokeOneArgumentEvent(1);
- invoker.InvokeOneArgumentEvent(2);
- invoker.InvokeOneArgumentEvent(3);
- if (logMessages[0] == "CountMessageEvent: 1" &&
- logMessages[1] == "CountMessageEvent: 2" &&
- logMessages[2] == "CountMessageEvent: 3" &&
- logMessages.Count == 3)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 9:
- InitializeTestCase(invoker, listener);
- // invoke combination of events directly through invoker
- invoker.InvokeOneArgumentEvent(1);
- invoker.InvokeNoArgumentEvent();
- invoker.InvokeOneArgumentEvent(3);
- if (logMessages[0] == "CountMessageEvent: 1" &&
- logMessages[1] == "MessageEvent" &&
- logMessages[2] == "CountMessageEvent: 3" &&
- logMessages.Count == 3)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- case 10:
- InitializeTestCase(invoker, listener);
- // invoke multiple one argument events directly through invoker
- invoker.InvokeNoArgumentEvent();
- invoker.InvokeOneArgumentEvent(2);
- invoker.InvokeNoArgumentEvent();
- if (logMessages[0] == "MessageEvent" &&
- logMessages[1] == "CountMessageEvent: 2" &&
- logMessages[2] == "MessageEvent" &&
- logMessages.Count == 3)
- {
- Console.WriteLine("Passed");
- }
- else
- {
- Console.WriteLine("FAILED");
- }
- break;
- }
- input = Console.ReadLine();
- }
- }
- ///
- /// Extracts the test case number from the given input string
- ///
- /// input string
- static void GetInputValueFromString(string input)
- {
- testCaseNumber = int.Parse(input);
- }
- ///
- /// Handles the log event from the Debug mock
- ///
- /// message to log
- static void HandleLogEvent(string message)
- {
- logMessages.Add(message);
- }
- ///
- /// Initializes test case
- ///
- static void InitializeTestCase(Invoker invoker, Listener listener)
- {
- logMessages.Clear();
- EventManager.ClearInvokersAndListeners();
- invoker.Start();
- listener.Start();
- }
- }
- }
This is the CountMessageEvent.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using UnityEngine.Events;
- namespace ProgrammingAssignment3
- {
- public class CountMessageEvent : UnityEvent <int>
- {
- }
- }
This is the listener.cs
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- ///
- /// An event listener
- ///
- public class Listener : MonoBehaviour
- {
- ///
- /// Use this for initialization
- ///
- public void Start()
- {
- // add your code here
- Invoker invoker = new Invoker();
- invoker.AddNoArgumentListener(HandleMessageEvent);
- invoker.AddOneArgumentListener(HandleCountMessageEvent);
- }
- ///
- /// Handles the no argument event
- ///
- void HandleMessageEvent()
- {
- print("MessageEvent");
- }
- ///
- /// Handles the one argument event
- ///
- /// number
- void HandleCountMessageEvent(int number)
- {
- print("CountMessageEvent: " + number);
- }
- }
This is the Invoker.cs
- using ProgrammingAssignment3;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.Events;
- ///
- /// An event invoker
- ///
- public class Invoker : MonoBehaviour
- {
- // add your fields for your message event support here
- Timer MessageTimer;
- MessageEvent messageEvent;
- // add your fields for your count message event support here
- int count;
- Timer CountMessageTimer;
- CountMessageEvent countMessageEvent = new CountMessageEvent();
- ///
- /// Awake is called before Start
- ///
- public void Awake()
- {
- // add your code here
- messageEvent = new MessageEvent();
- }
- ///
- /// Use this for initialization
- ///
- public void Start()
- {
- // add your code here
- MessageTimer = gameObject.AddComponent
(); - MessageTimer.Duration = 1;
- MessageTimer.Run();
- }
- ///
- /// Update is called once per frame
- ///
- void Update()
- {
- // add your code here
- if (MessageTimer.Finished)
- {
- messageEvent.Invoke();
- MessageTimer.Run();
- }
- }
- ///
- /// Adds the given listener to the no argument event
- ///
- /// listener
- public void AddNoArgumentListener(UnityAction listener)
- {
- // add your code here to add the given listener for
- // the message event
- //MessageEvent messageEvent = new MessageEvent();
- messageEvent = new MessageEvent();
- messageEvent.AddListener(listener);
- }
- ///
- /// Adds the given listener to the one argument event
- ///
- /// listener
- public void AddOneArgumentListener(UnityAction<int> listener)
- {
- // add your code here to add the given listener for
- // the count message event
- countMessageEvent.AddListener(listener);
- }
- ///
- /// Removes the given listener to the no argument event
- ///
- /// listener
- public void RemoveNoArgumentListener(UnityAction listener)
- {
- // add your code here to remove the given listener from the
- // message event
- messageEvent.RemoveListener(listener);
- }
- ///
- /// Removes the given listener to the one argument event
- ///
- /// listener
- public void RemoveOneArgumentListener(UnityAction<int> listener)
- {
- // add your code here to remove the given listener from the
- // count message event
- countMessageEvent.RemoveListener(listener);
- }
- ///
- /// Invokes the no argument event
- ///
- /// NOTE: We need this public method for the autograder to work
- ///
- public void InvokeNoArgumentEvent()
- {
- // add your code here to invoke the message event
- messageEvent.Invoke();
- }
- ///
- /// Invokes the one argument event
- ///
- /// NOTE: We need this public method for the autograder to work
- ///
- /// argument to use for the Invoke
- public void InvokeOneArgumentEvent(int argument)
- {
- // add your code here to invoke the count message event
- // with the given argument
- countMessageEvent.Invoke(argument);
- }
- }
This is the EventManager.cs
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.Events;
- ///
- /// The event manager
- ///
- public static class EventManager
- {
- // DON'T change the fields, properties, or ClearInvokersAndListeners
- // method; if you do, you'll break the autograder!
- // All your work in this class is in the last 4 methods
- #region Fields
- // no argument event support
- static Invoker noArgumentInvoker;
- static UnityAction noArgumentListener;
- // int argument event support
- static Invoker intArgumentInvoker;
- static UnityAction<int> intArgumentListener;
- #endregion
- #region Properties (for autograder use only)
- ///
- /// Gets the no argument invoker
- ///
- public static Invoker NoArgumentInvoker
- {
- get { return noArgumentInvoker; }
- }
- ///
- /// Gets the no argument listener
- ///
- public static UnityAction NoArgumentListener
- {
- get { return noArgumentListener; }
- }
- ///
- /// Gets the int argument invoker
- ///
- public static Invoker IntArgumentInvoker
- {
- get { return intArgumentInvoker; }
- }
- ///
- /// Gets the int argument listener
- ///
- public static UnityAction<int> IntArgumentListener
- {
- get { return intArgumentListener; }
- }
- #endregion
- #region Public methods
- ///
- /// Clears all the invokers and listeners from the event manager.
- ///
- /// Note: We need this functionality so the autograder can start with
- /// a "clean" event manager at the start of each test case
- ///
- public static void ClearInvokersAndListeners()
- {
- // no argument invoker and listener
- if (noArgumentInvoker != null)
- {
- if (noArgumentListener != null)
- {
- noArgumentInvoker.RemoveNoArgumentListener(noArgumentListener);
- noArgumentListener = null;
- }
- noArgumentInvoker = null;
- }
- // int argument invoker and listener
- if (intArgumentInvoker != null)
- {
- if (intArgumentListener != null)
- {
- intArgumentInvoker.RemoveOneArgumentListener(intArgumentListener);
- intArgumentListener = null;
- }
- intArgumentInvoker = null;
- }
- }
- ///
- /// Adds the invoker for the no argument event
- ///
- /// invoker
- public static void AddNoArgumentInvoker(Invoker invoker)
- {
- // add your code here
- noArgumentInvoker = invoker;
- }
- ///
- /// Adds the listener for the no argument event
- ///
- /// listener
- public static void AddNoArgumentListener(UnityAction listener)
- {
- // add your code here
- listener= noArgumentListener;
- }
- ///
- /// Adds the invoker for the int argument event
- ///
- /// invoker
- public static void AddIntArgumentInvoker(Invoker invoker)
- {
- // add your code here
- invoker= intArgumentInvoker;
- }
- ///
- /// Adds the listener for the int argument event
- ///
- /// listener
- public static void AddIntArgumentListener(UnityAction<int> listener)
- {
- // add your code here
- intArgumentListener = listener;
- }
- #endregion
- }
This is the code of MessageEvent.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using UnityEngine.Events;
- namespace ProgrammingAssignment3
- {
- public class MessageEvent : UnityEvent
- {
- }
- }
After implementing that, I faced this exception...
Please fix my error hurry. My work will be dued in Aug 3. Please help and fix my error and I will appreciate for your fix...
I also uploaded the zip file to see my full code...

Koustubh WPosted Aug 4, 2020, 3:56 AM
Ashutosh GuptaPosted Aug 1, 2020, 6:06 AM
Salman BegPosted Jul 31, 2020, 9:55 AM
Kaung Htet KyawPosted Jul 31, 2020, 9:53 AM
Kaung Htet KyawPosted Jul 31, 2020, 9:47 AM
Salman BegPosted Jul 31, 2020, 9:26 AM