Object reference not set to an object instance in array

1

I have a problem. I have to do a rental program where you tell the data of 5 movies, and then the program lists all the information!

And it's mandatory to make a class for this! I have already done the class DadosFilme , and instanciei the data variable to go fetch the information in class DadosFilme

I just made the data variable be a vector, and whenever I type the movie name at the beginning of the program it already gives this error:

  

"OBJECT REFERENCE NOT DEFINED FOR AN OBJECT INSTANCE"

class DadosFilme
    {
        public string NomeFilme;
        public double Duracao;
        public string NomeDiretor;
        public string Categoria;
        public int Ano;

    }

static void Main(string[] args) {
        DadosFilme[] dados = new DadosFilme[6];
        string categoria;

        for (int i = 0; i < 5; i++) {

            Console.Clear();
            Console.WriteLine("Digite as informações do filme: ");
            Console.Write("Nome do filme.....: ");
            dados[i].NomeFilme = Console.ReadLine(); //É AQUI QUE DÁ O ERRO

            Console.Write("Duração do filme..: ");
            dados[i].Duracao = double.Parse(Console.ReadLine());

            Console.Write("Nome do Diretor...: ");
            dados[i].NomeDiretor = Console.ReadLine();

            Console.Write("Categoria do filme: ");
            dados[i].Categoria = Console.ReadLine();

            Console.Write("Ano de lançamento.: ");
            dados[i].Ano = int.Parse(Console.ReadLine());

            i++;

        }

        Console.Clear();
        Console.WriteLine("Digite a sua categoria de filme preferida: ");
        categoria = Console.ReadLine();

        Console.Clear();

        for (int j = 0; j < 5; j++) {
            Console.WriteLine("Nome do filme............: " + dados[j].NomeFilme);
            Console.WriteLine("Duração do filme.........: " + dados[j].Duracao);
            Console.WriteLine("Nome do Diretor..........: " + dados[j].NomeDiretor);
            Console.WriteLine("Categoria do Filme.......: " + dados[j].Categoria);
            Console.WriteLine("Anop de Lançamento.......: " + dados[j].Ano);
            Console.WriteLine("\n\n");
        }

        Console.WriteLine("Filmes que pertencem a categoria {0}: ", categoria);

        dados[5].Categoria = categoria;

        for (int k = 0; k < 5; k++) {
            if (dados[k] == dados[5]) {
                Console.WriteLine(dados[k].NomeFilme);
            }
        }

    }
    
asked by anonymous 06.09.2018 / 20:26

4 answers

3

Each member of array must have an instance of class DadosFilme and is not creating this instance. You would have to do this before you could use each item:

dados[i] = new DadosFilme();

The code has some other problems, and could be simpler. For example it gives error if there is typing wrong (only I closed, but can make the treatment that you want, just do not let the code to break, this is programming error). I've changed the double to int because this does not make sense. Nor did I enter into merit that a class is not normally created because it must be an exercise, but keep in mind that this may be a problem in real code. Putting the category like it was a movie is something very wrong, but I let it.

using static System.Console;

public class Program {
    public static void Main() { 
        DadosFilme[] dados = new DadosFilme[6];
        for (int i = 0; i < 5; i++) {
            dados[i] = new DadosFilme();
            Clear();
            WriteLine("Digite as informações do filme: ");
            Write("Nome do filme.....: ");
            dados[i].NomeFilme = ReadLine();
            Write("Duração do filme..: ");
            if (!int.TryParse(ReadLine(), out dados[i].Duracao)) return;
            Write("Nome do Diretor...: ");
            dados[i].NomeDiretor = ReadLine();
            Write("Categoria do filme: ");
            dados[i].Categoria = ReadLine();
            Write("Ano de lançamento.: ");
            if (!int.TryParse(ReadLine(), out dados[i].Ano)) return;
        }
        Clear();
        WriteLine("Digite a sua categoria de filme preferida: ");
        var categoria = ReadLine();
        Clear();
        foreach (var item in dados) {
            WriteLine($"Nome do filme............: {item.NomeFilme}");
            WriteLine($"Duração do filme.........: {item.Duracao}");
            WriteLine($"Nome do Diretor..........: {item.NomeDiretor}");
            WriteLine($"Categoria do Filme.......: {item.Categoria}");
            WriteLine($"Anop de Lançamento.......: {item.Ano}\n\n");
        }
        WriteLine($"Filmes que pertencem a categoria {categoria}: ");
        dados[5] = new DadosFilme();
        dados[5].Categoria = categoria; //isto não faz sentido
        foreach (var item in dados) if (item == dados[5]) WriteLine(item.NomeFilme);
    }
}

public class DadosFilme {
    public string NomeFilme;
    public int Duracao;
    public string NomeDiretor;
    public string Categoria;
    public int Ano;
}

I placed GitHub for future reference .

    
06.09.2018 / 20:44
1

You need to instantiate every object in the given array.

Try this just after the for:

dados[i] = new DadosFilme();
    
06.09.2018 / 20:42
1

You have created a 6-position array, but you have not instantiated the object. Just instantiate the object that will work:

static void Main(string[] args) {
    DadosFilme[] dados = new DadosFilme[6];
    string categoria;

    for (int i = 0; i < 5; i++) {
        //Adicione essa linha de código que irá funcionar
        dados[i] = new DadosFilme();

        Console.Clear();
        Console.WriteLine("Digite as informações do filme: ");
        Console.Write("Nome do filme.....: ");
        dados[i].NomeFilme = Console.ReadLine(); //É AQUI QUE DÁ O ERRO

        Console.Write("Duração do filme..: ");
        dados[i].Duracao = double.Parse(Console.ReadLine());

        Console.Write("Nome do Diretor...: ");
        dados[i].NomeDiretor = Console.ReadLine();

        Console.Write("Categoria do filme: ");
        dados[i].Categoria = Console.ReadLine();

        Console.Write("Ano de lançamento.: ");
        dados[i].Ano = int.Parse(Console.ReadLine());

        i++;

    }

    Console.Clear();
    Console.WriteLine("Digite a sua categoria de filme preferida: ");
    categoria = Console.ReadLine();

    Console.Clear();

    for (int j = 0; j < 5; j++) {
        Console.WriteLine("Nome do filme............: " + dados[j].NomeFilme);
        Console.WriteLine("Duração do filme.........: " + dados[j].Duracao);
        Console.WriteLine("Nome do Diretor..........: " + dados[j].NomeDiretor);
        Console.WriteLine("Categoria do Filme.......: " + dados[j].Categoria);
        Console.WriteLine("Anop de Lançamento.......: " + dados[j].Ano);
        Console.WriteLine("\n\n");
    }

    Console.WriteLine("Filmes que pertencem a categoria {0}: ", categoria);

    dados[5].Categoria = categoria;

    for (int k = 0; k < 5; k++) {
        if (dados[k] == dados[5]) {
            Console.WriteLine(dados[k].NomeFilme);
        }
    }

}
    
06.09.2018 / 20:43
1

I think a list would look better so I would do it like this: first you would create a toString () method in your class

    class DadosFilme {

    public string NomeFilme { get; set; }
    public double Duracao { get; set; }
    public string NomeDiretor { get; set; }
    public string Categoria { get; set; }
    public int Ano { get; set; }


    public override string ToString() {
        return "Nome do filme: " + NomeFilme +
               "\nDuração: " + Duracao.ToString("N2", CultureInfo.InvariantCulture) +
               "\nNome do Diretor: " + NomeDiretor +
               "\nCategoria: " + Categoria +
               "\nAno: " + Ano;
    }
}

then store td in a list and then display on the screen

  class Program {
    static void Main(string[] args) {

        List<DadosFilme> listaFilme = new List<DadosFilme>();

        DadosFilme dados = new DadosFilme();
        Console.Write("Nome do filme: ");
        dados.NomeFilme = Console.ReadLine();
        Console.Write("Duração do filme: ");
        dados.Duracao = double.Parse(Console.ReadLine());
        Console.Write("Nome do diretor: ");
        dados.NomeDiretor = Console.ReadLine();
        Console.Write("categoria do filme: ");
        dados.Categoria = Console.ReadLine();
        Console.Write("Ano de lançamento: ");
        dados.Ano = int.Parse(Console.ReadLine());

        listaFilme.Add(dados);

        foreach (DadosFilme item in listaFilme) {

            Console.WriteLine(item);

        }

        Console.ReadKey();

    }
}

}

    
07.09.2018 / 04:22