C# NullReferenceException

Hi,

When I start my game I get this error:

NullReferenceException: Object reference not set to an instance of an object
PlayerAttack.Start () (at Assets/Standard Assets/Scripts/PlayerAttack.cs:19)

And I don’t know why. I don’t have much experience in programming, so it might be a very noobish question :stuck_out_tongue:

Basically I am trying to get a List from another script (PlayerKnowledge), then copy the content into a new List<>Knowledge here in the PlayerAttack script, so I can later on iterate through the content, and if something is equal to a specific string, then a specific attack should happen.

Here is the code:

public class PlayerAttack : MonoBehaviour {
	private PlayerKnowledge playerKnowledge;
	private List<string> knowledge = new List<string>();
	
	// Use this for initialization
	void Start () {

                //This is the line where the error occurs
		var know = playerKnowledge.knownNames;
	
                //And if someone knows how to print out content of a List,
                // I would be grateful to know :P 
		Debug.Log("know returns" + know);
		
		if(know != null){
		knowledge.AddRange(know);
		Debug.Log("knowledge !null returns: " + knowledge);
		}
		
	}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class PlayerKnowledge : MonoBehaviour {
	public List<string> knownNames; 
	public GameObject item;

	private GameObject book; 
	
	// Use this for initialization
	void Start () {
		var knownNames = new List<string>();
		knownNames.Add("Test");
		
		Debug.Log("PlayerKnowledge Start: " + knownNames);
		
	}
	
	// Update is called once per frame
	void Update () {
		
		if(Input.GetKey(KeyCode.R)) {
			readBook();	
		}
	}
	
	//reads the targeted book
	private void readBook() {
				
				BookFolklore bf = (BookFolklore)item.GetComponent("BookFolklore");
				string name = bf.bookName;
				
				knownNames.Add (name);
				
			}

}

Anyone who can help me with this? Let me know if you need more information.

You are using playerKnowledge before setting it to anything. Either drag something onto it in the Insector (an object with one of those on it) or use GameObject.Find and/or GetComponent to get an instance of it.

First, use awake to instantiate the list. Second, you made knownNames a local in Start, i would have figured it would have complained(unity console), but i guess it didn’t.


public class PlayerKnowledge : MonoBehaviour {
    public List<string> knownNames; 
    public GameObject item;

    private GameObject book; 
 
    void Awake() {
       knownNames = new List<string>();
    }

    // Use this for initialization
    void Start () {
       knownNames.Add("Test");

       Debug.Log("PlayerKnowledge Start: " + knownNames);

    }

    // Update is called once per frame
    void Update () {

       if(Input.GetKey(KeyCode.R)) {
         readBook();  
       }
    }

    //reads the targeted book
    private void readBook() {

          BookFolklore bf = (BookFolklore)item.GetComponent("BookFolklore");
          string name = bf.bookName;

          knownNames.Add (name);

         }

}