Undefined object reference for an object instance in array

Asked

Viewed 1,449 times

1

I have a problem. I have to make a video rental program in which you say the data of 5 movies, and then the program lists all the information!

And it is mandatory to make a class for this! I’ve done the class DadosFilme, and entered the data variable to retrieve the information in the class DadosFilme

Only I made the variable given to be a vector, and every time I type the name of the movie at the beginning of the program 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);
            }
        }

    }
  • show the line giving error

  • this message means that you are trying to use a null object, need to know where this access is.

4 answers

3

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

dados[i] = new DadosFilme();

The code has some other problems, and it could be simpler. For example it gives error if there is wrong typing (only closed, but can do the treatment you want, just do not let the code break, this is programming error). I changed the double for int Because this doesn’t make sense. I didn’t even get into the point that a class isn’t usually created like this because it’s supposed to be an exercise, but keep in mind that this could be a real code problem. Putting the category as if it were a movie is something very wrong, but I left.

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 put in the Github for future reference.

  • I’ll try, thanks Jhow!+.......

  • It worked, Thanks! but only this repeating 3 times instead of 5!+.......

  • @davidgomezsouza I even saw an issue I fixed, but I took the test and is asking 5 times.

1

Need to instantiate each vector object given.

Try that right after:

dados[i] = new DadosFilme();

1

You created an array of 6 positions, but you did not instantiate the object. Simply 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);
        }
    }

}

1

I think a list would look better, so I would do like this: would first create a toString() method in its 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 show 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();

    }
}

}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.