OnTriggerEnter -- NullReferenceException -- C#

here is the code I Recieve
NullReferenceException: Object reference not set to an instance of an object
NPC_Battle_AI.OnTriggerEnter (UnityEngine.Collider col) (at Assets/Assets/Scripts/NPC_Battle_AI.cs:82)

I added a self check but it still popped up null.
I have attached the script. Can anyone Help?

using UnityEngine;
using System.Collections;

public class NPC_Battle_AI : MonoBehaviour {

	public GameObject NPC;
	public float rotationSpeed;
	public GameObject target;
	public bool move;
	public bool attack;

	public GameObject[] projectileSpawn;
	public GameObject projectile;
	private GameObject missile1 ;
	private GameObject missile2 ;
	public float reloadTine;
	public GameObject closest;
	public bool openBattle;

	void Start ()
	{
		if (target == null)
		{
			openBattle = true;
			move = false;
			NPC = gameObject;
			rotationSpeed = 5;
		FindClosestEnemy(target);
		}
	}

	void Update ()
	{

		if (move == true)
		{
		NPC.transform.rotation = Quaternion.Slerp (NPC.transform.rotation, Quaternion.LookRotation (target.transform.position - NPC.transform.position), rotationSpeed * Time.deltaTime);
		transform.position = Vector3.MoveTowards (transform.position,target.transform.position, GetComponent <Stats_Script>().speed *Time.deltaTime );
		}
		else if (attack == true)
		{
			Attack ();

			if (target == null)
			{
				attack = false;
				GetComponent <NPC_Battle_AI>().enabled = false;
				gameObject.GetComponent<Basic_AI>().enabled = true;

			}
		}
	}	

	void FindClosestEnemy(GameObject target) {
		if (openBattle == true )
			{
			GameObject[] gos;
			gos = GameObject.Find ("Main Camera").GetComponent <Tower_Database>().registry;

			GameObject closest;
			float distance = Mathf.Infinity;
			Vector3 position = transform.position;
			foreach (GameObject go in gos) {
				Vector3 diff = go.transform.position - position;
				float curDistance = diff.sqrMagnitude;
				if (curDistance < distance) {
					closest = go;
					target = closest;
					distance = curDistance;
				}
			}
	//		return closest;
		}
	}

	void OnTriggerEnter (Collider col)
	{
		if (col != null)
		{
		if (openBattle == true)
		{
				if (col.gameObject.GetComponent <Stats_Script>().userActive == true)
				{
					target = col.gameObject;
					move = false;
					attack = true;
				}
			}
		}
	}

	void Attack ()
	{
		attack = false;
		if (projectileSpawn.Length == 0)
		{
			gameObject.GetComponent <NPC_Battle_AI>().enabled = false;
			gameObject.GetComponent <Basic_AI>().enabled = true;
		}

		else {
			missile1 = Instantiate (projectile, projectileSpawn[0].transform.position, projectileSpawn[0].transform.rotation) as GameObject;
			if (projectileSpawn.Length > 1 )
			{
				missile2 = Instantiate (projectile, projectileSpawn[1].transform.position, projectileSpawn[1].transform.rotation) as GameObject;
			}

			StartCoroutine (Wait());
		}
	}
	
	IEnumerator Wait ()
	{
		print (gameObject.name + " Reload.");
		yield return new WaitForSeconds (reloadTine);
		attack = true;
	}

}

The ‘.userActive’ assumes that ‘GetComponent’ found a component of the type ‘Stats_Script’ on the ‘gameObject’ from ‘col’. It would seem to be a false assumption.

Try storing the return value of ‘GetComponent’ and checking if it’s null before using it.

Stats_Script s = col.gameObject.GetComponent <Stats_Script>();
if(s != null && s.userActive == true)
    //...

Like robertu said, most likely the colliding object does not contain the script Stats_Script on it.

You should add a test for this in your code, and ignore colliders that do not have this script:

Stats_Script statsScript = col.gameObject.GetComponent <Stats_Script>();
if (statsScript != null && statsScript.userActive == true)
{
    target = col.gameObject;
    move = false;
    attack = true;
}